我这样做了一个查询
SELECT *
FROM TABLE_A
WHERE 1=1
AND ID_NO IN (
SELECT ID_NO
FROM TABLE_B
WHERE SEQ = '1'
)
问题在于没有列' ID_NO'在TABLE_B中,我期待查询不起作用。 但是这个查询有效。我不明白为什么。
为什么它不会导致错误?
答案 0 :(得分:5)
如果table_B没有名为ID_NO的列,但table_A具有,则查询正确。然后你会得到一个相关的子查询,子查询选择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);