当使用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语句中选择所有列,所以为什么我会得到这个错误?
答
通过阅读您的意见,在您的最终查询中,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
。
这两个表是否有“trade_id”列? –
只有交易表具有“trade_id”列 – Suong
对不起,我不是想要询问trade_id,但是“share_id”是在两个表上还是仅在一个表上? –