我目前正在使用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语句中的*会选择所有列,为什么我会收到此错误?
答案 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
的引用。