我有这两个表,在第一个表(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);
我也尝试了内部联接,但结果不是我希望的
内部联接应该起作用,但是您需要使用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 | +-------+-----+--------------+