错误的SELECT子查询在' IN'条件

时间:2016-12-22 08:05:40

标签: sql oracle in-subquery

我这样做了一个查询

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

问题在于没有列' ID_NO'在TABLE_B中,我期待查询不起作用。 但是这个查询有效。我不明白为什么。


为什么它不会导致错误?

1 个答案:

答案 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);