我正在尝试解决这个 SQL 问题。
这些是我的桌子:
author
(作者 ID、名字、中间名、姓氏)written_by
(bookdescID、authorID、角色)- 角色可以是“作者”、“编辑”或“翻译者”我正在尝试查找从未与其他作者合作过的作者姓名列表,无论是合著者、合译者还是合编者。我花了几天时间试图找到这个解决方案,但找不到它。
这是我到目前为止所拥有的:
SELECT DISTINCT author.FIRSTNAME || ' ' || author.LASTNAME AS "Author Name"
FROM author
JOIN written_by ON author.AUTHORID = written_by.AUTHORID
WHERE author.AUTHORID = written_by.AUTHORID
GROUP BY written_by.BOOKDESCID
HAVING COUNT(written_by.authorID) = 1;
正确答案应该显示 321 行,但我一直加载 331 行。我的教授说我应该使用
NOT IN
,但我也找不到。
抱歉,我不是要你做作业,但我只是迷失了方向,似乎找不到正确的答案。非常感谢!
您可以使用窗函数按
BOOKDESCID
进行计数。然后按作者分组,并检查他们的书籍中没有一本的 any 计数大于 1。您可以使用 HAVING
中的条件聚合来完成此操作。
SELECT
a.FIRSTNAME || ' ' || a.LASTNAME AS "Author Name"
FROM (
SELECT
wb.*,
COUNT(*) OVER (PARTITION BY wb.BOOKDESCID) AS countAuthors
FROM written_by wb
) wb
JOIN author a ON a.AUTHORID = wb.AUTHORID
GROUP BY
a.AUTHORID,
a.FIRSTNAME,
a.LASTNAME
HAVING COUNT(CASE WHEN countAuthors > 1 THEN 1 END) = 0;