2016-08-30 2 views
3

존재하지 않는 열을 참조하므로 실제로 실패 할 것으로 예상되는 하위 쿼리는 하위 쿼리에서 참조되는 테이블의 모든 행을 반환합니다. postgresql 또는 postgresql 버그에서 예상되는 동작입니까? postgresql 하위 쿼리가 잘못된 열에서 실패 할 때 행을 반환합니다.

문제를 시뮬레이션하려면 하위 쿼리 참조가 column_b을 사용해야 테이블 zz_temp_01에서 column_c 이후

create table zz_temp_01 
(
column_a varchar(20), 
column_b int 
) 
; 

create table zz_temp_02 
(
column_c int, 
column_d varchar(20) 
) 
; 


insert into zz_temp_01 
values 
('test1', 1), 
('test2', 2) 
; 

insert into zz_temp_02 
values 
(1, 'Monday'), 
(2, 'Tuesday'), 
(3, 'Wednesday'), 
(4, 'Thursday'), 
(5, 'Friday'), 
(6, 'Saturday'), 
(7, 'Sunday') 
; 

select * from zz_temp_02 
where column_c in 
(select column_c from zz_temp_01) 
; 

이 쿼리는 분명 잘못된 것입니다. "select column_c from zz_temp_01"을 실행하면 오류가 발생합니다. "column_c"열이 없습니다. 그러나 전체 쿼리가 실행되면 결과는 다음과 같습니다.

1;"Monday" 
2;"Tuesday" 
3;"Wednesday" 
4;"Thursday" 
5;"Friday" 
6;"Saturday" 
7;"Sunday" 

이는 전체 zz_temp_02 테이블입니다. 나는 쿼리가 오류 조건에서 실패하거나 적어도 행을 반환하지 않을 것으로 예상했을 것이다. 에 column_c가 을 (zz_temp_01에서 column_B 해당) 여기서

+2

아니요. 맞습니다. 이것은 식별자의 가시성이 SQL 표준에서 정의되는 방식입니다. –

+0

여기를 참조하십시오 : https://www.postgresql.org/message-id/flat/20151030003924.3017.23003%40wrigleys.postgresql.org#[email protected] 및 여기 : https : //www.postgresql. org/message-id/flat/20160714135233.1410.92538%40wrigleys.postgresql.org#[email protected] –

답변

0

zz_temp_02 에서 *이 하나

선택 시도;

1

아니요, 이것은 SQL 표준에서 요구하는대로 올바른 동작입니다.

대한 자세한 설명은 내가 질문에서 사람과 메일 스레드에서 열 및 테이블 이름을 대체 this mail thread

A common complaint but unfortunately something that simply has to be learned.

The reference to column_c in the subquery comes from zz_temp_02 - which in this case makes the where clause (zz_temp_02.column_c IN (zz_temp_02.column_c)) ​which will always evaluate to true.


볼 수 있지만, 견적, 그렇지 않으면 변경되지 않은 것입니다.

관련 문제