使用SELECT *返回时,Parent Query不会看到子查询的列

时间:2017-08-25 15:46:53

标签: sql oracle

我目前正在使用Oracle SQL开发人员学习SQL。

在编写查询时,我想出了同一查询的三个不同版本。

SELECT 
  sh.share_id
  FROM shares sh
    LEFT JOIN trades tr
      ON sh.share_id = tr.share_id 
  WHERE trade_id is NULL;

SELECT 
  sr.share_id
  FROM (SELECT sh.share_id, tr.trade_id
      FROM shares sh
    LEFT JOIN trades tr
      ON sh.share_id = tr.share_id) sr
  WHERE sr.trade_id is NULL;

SELECT 
  sr.share_id
  FROM (SELECT *
      FROM shares sh
    LEFT JOIN trades tr
      ON sh.share_id = tr.share_id) sr
  WHERE sr.trade_id is NULL;

前两个查询编译,运行并返回相同的结果集但是当我尝试运行第三个查询时,我在第三个查询的第二行得到一个错误。 “SR”。“SHARE_ID”:标识符无效。 我知道SELECT语句中的*会选择所有列,为什么我会收到此错误?

2 个答案:

答案 0 :(得分:2)

通过阅读您的评论,在您的最终查询中,DBMS不知道您share_id使用哪个SELECT sr.share_id。您的子查询的SELECT *正在抓取两个share_id列。您必须执行类似第二次查询的操作。

答案 1 :(得分:0)

问题是select *正在从两个表中选择所有列,即使是那些具有相同名称的列。所以,你得到share_id两次。一个简单的解决方法是使用USING

SELECT sr.share_id
FROM (SELECT *
      FROM shares sh LEFT JOIN
           trades tr
           USING (share_id)
    ) sr
WHERE sr.trade_id is NULL;

当然,这只会修复对share_id的引用。