繁体   English   中英

在 SQL 中获取 2 位或更多作者的书籍

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM