[英]Get books with 2 or more authors in SQL
所以我有一个问题,我想获得有两个以上作者的书。 我是 T-SQL 的新手,所以我还不太懂。。
我的桌子看起来像这样
书台:
BOOK
---------------
book_id | title
---------------
1 | A
2 | B
作者表:
AUTHOR
----------------
author_id | name
----------------
1 | Nick
2 | Clem
3 | John
书籍作者表:
BOOK_AUTHOR
--------------------
book_id | author_id
--------------------
1 | 1
1 | 2
2 | 3
因此,如您所见,我想要的预期 output 是这样的:
Author_id | title | author_name
------------------------------------------
1 | A | Nick
2 | A | Clem
这是正在执行的 SQL 查询:
SELECT a.Id, a.name, b.title, count(ba.idBook)
FROM BookAuthors as ba
JOIN Author as a
ON ba.IdAuthor = a.Id
JOIN book as b
ON ba.idBook = b.id
GROUP BY a.Id, a.name, b.title
HAVING count(ba.idBook) > 1
提前谢谢各位!
您可以使用子查询,它将查找所有拥有两个以上作者的书籍 ID:
SELECT c.book_id
FROM book_author c
GROUP BY c.book_id
HAVING count(c.book_id) >= 2
...然后在您的主查询中使用它,以从您的联接表中获取所有作者和书籍,其书籍 ID 出现在子查询中:
SELECT ba.author_id, a.name AS author_name, b.title
FROM
book_author ba JOIN book b ON ba.book_id = b.book_id
JOIN author a ON ba.author_id = a.author_id
WHERE
b.book_id IN (SELECT c.book_id
FROM book_author c
GROUP BY c.book_id
HAVING count(c.book_id) >= 2);
你想要有两个以上作者的书。 您的查询已接近,但您想排除特定作者信息:
SELECT b.Id, b.title, COUNT(*) as num_authors
FROM BookAuthors ba JOIN
book b
ON ba.idBook = b.id
GROUP BY b.id, b.title
HAVING COUNT(*) > 2;
这个问题似乎并没有要求您列出作者。 如果是这样,一个方便的方法是STRING_AGG()
:
SELECT b.Id, b.title, COUNT(*) as num_authors,
STRING_AGG(author_name, ', ') as authors
FROM BookAuthors ba JOIN
book b
ON ba.idBook = b.id
GROUP BY b.id, b.title
HAVING COUNT(*) > 2;
STRING_AGG()
是最近添加到 SQL 服务器的,因此它可能在您使用的版本中不可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.