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

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

(这次选择的结果和cust表的行号是一样的。)

4

2 回答 2

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

高温高压

于 2018-09-28T08:34:09.110 回答
1

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

于 2018-09-28T09:18:00.777 回答