当使用SELECT返回时,父查询没有看到子查询的列*

问题描述:

我目前正在使用Oracle SQL开发人员学习SQL。当使用SELECT返回时,父查询没有看到子查询的列*

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

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语句中选择所有列,所以为什么我会得到这个错误?

+0

这两个表是否有“trade_id”列? –

+0

只有交易表具有“trade_id”列 – Suong

+0

对不起,我不是想要询问trade_id,但是“share_id”是在两个表上还是仅在一个表上? –

通过阅读您的意见,在您的最终查询中,DBMS不知道哪个share_id用于您的SELECT sr.share_id。也就是你的子查询的SELECT *正在抓取两列share_id列。你必须做你喜欢的第二个查询。

+0

哦,我只是注意到,如果我在FROM中运行子查询,它包括返回表中的share_id和share_id_1,正如您提到的那样,它会在两个表中占用share_id。感谢您的帮助。 – Suong

问题是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