如何从子选择中选择不存在的列?

时间:2018-09-28 08:27:12

标签: sql oracle sql-subselect

select * from cust
where cust_id in
(select cust_id from acc_co
where objectum = 'EXIST');

acc_co 表中没有 cust_id 列。但是当我运行选择时,它有结果。但是如何?

(此选择的结果与 cust 表的行号相同。)

2 个答案:

答案 0 :(得分:1)

为列添加前缀应该为您回答这一问题:

select * from cust c
where c.cust_id in
(select a.cust_id from acc_co a
where a.objectum = 'EXIST');

VS

select * from cust c
where c.cust_id in
(select c.cust_id from acc_co a
where a.objectum = 'EXIST');
  • 您会注意到第一个版本失败了,第二个版本显示了您见证的行为(您获得了完整的cust表)。
  • 第一个版本尝试执行您认为对查询所做的操作:选择一个不存在的列。
  • 第二个版本显示oracle实际如何解释您的查询。
  • 要搜索的主题是表别名,其中有很多页面可以很好地解释它们
  • 通常最好使用别名来避免这种情况
  • 当列名仅出现在查询的一个表中时,则oracle允许您不使用查询中的别名。
  • 一列出现在多个表中时,oracle将引发错误:ORA-00918: column ambiguously defined

HTH

答案 1 :(得分:1)

问题是您不使用别名,因此DBMS认为cust_id是第一个表cust的列。由于使用的是相关子查询,因此可以将子查询中的数据识别为内部表数据或外部表数据。这种情况不仅适用于Oracle,而且适用于任何RDBMS。为了避免这种歧义,请在相关子查询中使用别名。