SQL - Проблема с запросом на выбор с некоторым условием - PullRequest
1 голос
/ 17 июня 2020

У меня есть две таблицы, в первой (WRITES) есть книги, которые хранятся в базе данных (DOI определяет код книги и ORCID автора книги, во второй (QUOTES) цитаты каждая книга). Результат, которого я пытаюсь достичь, - иметь идентификационные коды авторов, которые в своих книгах упомянули книги, написанные другими авторами, а не сами по себе

WRITES

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 Ответ

3 голосов
/ 17 июня 2020

Внутренние соединения должны работать, но вам нужно использовать таблицу 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 |
+-------+-----+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...