我如何 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。为避免这种歧义,请在相关子查询中使用别名。
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。为避免这种歧义,请在相关子查询中使用别名。