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

Posted

技术标签:

【中文标题】SQL - 在某些条件下选择查询的问题【英文标题】:SQL - Problem with a query to select with some condition 【发布时间】: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);

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

【问题讨论】:

【参考方案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 后,查询起作用了。

以上是关于SQL - 在某些条件下选择查询的问题的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档

查询以选择某些条件为真的两个日期之间的列的总和

DetachedCriteria和Criteria

条件Linq查询

Hive查询:根据条件选择一列,另一列值匹配某些特定值,然后将匹配结果创建为新列

选择查询中的 SQL 条件变量