2016-12-22 13 views
-2

Я сделал запрос, как этотНеправильный ВЫБРАТЬ подзапрос в «В» состоянии

SELECT * 
FROM TABLE_A 
WHERE 1=1 
    AND ID_NO IN (
     SELECT ID_NO 
     FROM TABLE_B 
     WHERE SEQ = '1' 
    ) 

Проблема была не в столбце «ID_NO» в TABLE_B.So я ожидал, что запрос не работает. Но этот запрос сработал. Я не понимаю, почему.


Почему это не вызвало ошибку?

+1

просьба представить таблицу stucture – Jens

+0

это правильно запрос, если ID_NO из table_A имеет другой тип в ID_NO из table_B, это вызовет проблему с другими способами. –

ответ

5

Запрос верный, если table_B не имеет столбца с именем ID_NO, но table_A имеет. Тогда у вас будет коррелированный подзапрос, где подзапрос выбирает ID_NO, ссылается на внешний ID_NO-атрибут table_A (по-видимому, не имеет смысла, но подходит для компилятора).

Рассмотрим следующую схему:

create table table_a (
    id_no int 
); 

create table table_b (
    other_id_no int 
    ); 

insert into table_a values (1),(2); 
insert into table_b values (1),(3); 

Затем, следующий запрос будет компилировать; но он всегда будет давать пустой результат, потому что на самом деле означает что-то вроде где id_no не в (id_no):

select * from table_a where id_no not in (select id_no from table_b); 

Когда имеешь дело с подзапросов, я предложил бы использовать псевдонимы таблиц для того, чтобы избежать такого непреднамеренного поведения , Например, следующий запрос не компилируется, и компилятор дает подсказку, что это не так:

select * from table_a a where a.id_no not in (select b.id_no from table_b b); 
Error: Unknown column 'b.id_no' in 'field list' 

Исправление ошибки затем приводит к:

select * from table_a a where a.id_no not in (select b.other_id_no from table_b b); 
+0

Отличный ответ. Когда я присоединяюсь к двум таблицам типа «от TABLE_A, TABLE_B», я всегда использовал псевдоним, чтобы избежать непреднамеренного поведения, но я никогда не пробовал его в подзапросе. Это была моя ошибка. Спасибо, Стефан за хороший комментарий – nick