2016-12-22 24 views
-2

我做了一個這樣的查詢在錯誤的SELECT子查詢「IN」的條件

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

的問題是存在TABLE_B.So沒有列「id_no上」我期待該查詢不起作用。 但這個查詢工作。我不明白爲什麼。


爲什麼它不會導致錯誤?

+1

請提供表stucture – Jens

+0

這是一個正確的查詢,如果來自table_A的ID_NO與來自table_B的ID_NO具有不同的類型,則會導致問題,其他方式可提供更多詳細信息。 –

回答

5

如果table_B沒有名爲ID_NO的列,但是table_A具有,則查詢正確。然後你會有一個相關的子查詢,其中子查詢select ID_NO引用table_A的外部ID_NO屬性(一定是沒有道理的,但對編譯器來說是正確的)。

考慮以下方案:

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

很棒的回答。當我加入兩個表,比如'from TABLE_A,TABLE_B'時,我總是使用別名來避免意外的行爲,但我從來沒有在子查詢中試過。那是我的錯誤。謝謝斯蒂芬的好評 – nick