我如何 select 来自子 select 的不存在的列?

How can I select non-existing column from sub-select?

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

acc_co table 中没有 cust_id 列。但是当我 运行 select 时,它有结果。但是怎么办?

(这个select的结果和custtable的行号是一样的。)

为列添加前缀应该可以为您解答这一问题:

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 table)。
  • 第一个版本尝试执行您认为对查询执行的操作:select 一个不存在的列。
  • 第二个版本显示了 oracle 如何实际解释您的查询。
  • google 的主题是 table 别名,那里有很多页面都很好地解释了它们
  • 通常最好使用别名来避免这种情况
  • 当列名仅出现在查询的 table 之一中时,oracle 允许您不使用像在查询中那样的别名。
  • 一旦一列出现在多个 table 中,oracle 将抛出错误:ORA-00918: column ambiguously defined

HTH

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