SQL-在某些条件下选择查询的问题

问题描述 投票:1回答:1

我有这两个表,在第一个表(WRITES)中,有几本书存储在数据库中(DOI代表该书的代码,而ORCID是该书的作者,在第二个表(QUOTES)中,每个表中都有引号书)。我要达到的结果是,使作者的识别码在他们的书中提到其他作者而非自己写的书]

WRITES

Doi   Orcid
1     100
2     200
3     300
4     100

QUOTES

Doi DoiMentioned
1          4
2          3
3          4

预期输出:]

ORCID Doi    DoiMentioed
200    2         3
300    3         4

我的代码:

(select w.orcid
from writes w
join quotes q
on q.doi = w.doi

minus

select w.orcid
from writes w
join quotes q
on q.doimentioned = w.doi);

我也尝试了内部联接,但结果不是我希望的

sql oracle join
1个回答
3
投票

内部联接应该起作用,但是您需要使用WRITES表两次:一次用于提到作者,一次用于提到作者。然后比较它们以确保它们不同。

SELECT w.orcid, w.doi, q.doimentioned
FROM    writes w
INNER JOIN quotes q on q.doi = w.doi
INNER JOIN writes w2 ON w2.doi = q.doiMentioned
WHERE w2.orcid != w.orcid;

完整示例,带有来自OP的数据,以显示其工作原理:

WITH writes (doi, orcid) AS 
  ( SELECT 1, 100 FROM DUAL UNION ALL
    SELECT 2, 200 FROM DUAL UNION ALL
    SELECT 3, 300 FROM DUAL UNION ALL
    SELECT 4, 100 FROM DUAL ),
  quotes ( Doi, DoiMentioned ) AS 
  ( SELECT 1,4 FROM DUAL UNION ALL
    SELECT 2,3 FROM DUAL UNION ALL
    SELECT 3,4 FROM DUAL )
SELECT w.orcid, w.doi, q.doimentioned
FROM    writes w
INNER JOIN quotes q on q.doi = w.doi
INNER JOIN writes w2 ON w2.doi = q.doiMentioned
WHERE w2.orcid != w.orcid;
+-------+-----+--------------+
| ORCID | DOI | DOIMENTIONED |
+-------+-----+--------------+
|   200 |   2 |            3 |
|   300 |   3 |            4 |
+-------+-----+--------------+
© www.soinside.com 2019 - 2024. All rights reserved.