【问题标题】:SQL - Problem with a query to select with some conditionSQL - 在某些条件下选择查询的问题
【发布时间】:2020-06-17 16:57:04
【问题描述】:

我有这两个表,在第一个(WRITES)中有存储在 db 中的书籍(DOI 标识书籍代码和 ORCID 书籍的作者,在第二个(QUOTES)中有引号每本书)。 我试图达到的结果是让那些在他们的书中提到其他作者而不是他们自己写的书的作者的识别码

Doi   Orcid
1     100
2     200
3     300
4     100

报价

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】:

    内连接应该可以工作,但是您需要使用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 |
    +-------+-----+--------------+
    

    【讨论】:

    • @Gwynbleidd 我刚刚用数据更新了答案以显示它有效。
    • 再次感谢!关闭并重新打开 Sql Developer 后,查询起作用了。
    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多