我做了一個這樣的查詢在錯誤的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上」我期待該查詢不起作用。 但這個查詢工作。我不明白爲什麼。
爲什麼它不會導致錯誤?
我做了一個這樣的查詢在錯誤的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上」我期待該查詢不起作用。 但這個查詢工作。我不明白爲什麼。
爲什麼它不會導致錯誤?
如果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);
很棒的回答。當我加入兩個表,比如'from TABLE_A,TABLE_B'時,我總是使用別名來避免意外的行爲,但我從來沒有在子查詢中試過。那是我的錯誤。謝謝斯蒂芬的好評 – nick
請提供表stucture – Jens
這是一個正確的查詢,如果來自table_A的ID_NO與來自table_B的ID_NO具有不同的類型,則會導致問題,其他方式可提供更多詳細信息。 –