是否可以使用单个SQL查询在一行中显示每个作者的书籍?

时间:2016-09-15 07:06:30

标签: sql-server

首先,如果问题的措辞不是最好,我会道歉。我是SQL的新手,并且不确定如何使用正确的措辞来表达它。请参阅下面的详细信息,以帮助推断我正在寻找的内容:

我有一个Authors表,主键为Id,还有另外两列:姓名和年龄。

我还有一个带有Id主键的Books表,以及其他列:Title,Price,Pages和Genre。

我已经了解到多对多关系意味着我应该有一个中间表,使用其他表中的键来配对这些关系。所以我有一个AuthorsBooks表,主键为Id(可能不需要),以及这些列:AuthorId和BookId。

我的目标是生成一个结果/表格,每个作者只显示一次,所有标题都列在后面的列中。这是否可能,因为一些作者可能拥有比其他书更多的书?

这就是我现在所拥有的,以及我得到的结果:

class ConfigMap(underlying: Map[String, Any]) extends Map[String, Any] ...

产生类似这样的东西:

SELECT DISTINCT Name
        ,Title

FROM [dbo].[AuthorsBooks]
JOIN dbo.Authors
    ON AuthorId = Authors.Id
JOIN dbo.Books
    ON BookId = Books.Id

但我想要这样的事情:

Author1 Book1
Author1 Book2
Author1 Book5
Author2 Book3
Author2 Book4
Author3 Book4
Author3 Book5

这甚至可能吗?如果需要填写一些NULL(在最后一列没有作者的条目,没有足够的书籍来匹配它上面/下面的行),这很好。我已经尝试过GROUP BY子句,但是我一直遇到错误,并且找不到在这种情况下可以工作的聚合函数,因为它们不是数字。

作为一个初学者,一个更简单的解决方案将是最好的,但如果没有“简单”的解决方案,那么可以帮助我概念化如何处理这个问题的工作将非常感激。

非常感谢!

1 个答案:

答案 0 :(得分:0)

你可以这样试试,

SELECT DISTINCT NAME
    ,(
        SELECT DISTINCT Title + ' '
        FROM [dbo].[AuthorsBooks] ab
        JOIN dbo.Authors a ON ab.AuthorId = a.Id
        JOIN dbo.Books b ON ab.BookId = b.Id
        WHERE ab.authorid = ab1.authorid
        FOR XML PATH('')
        ) AS TITLE
FROM [dbo].[AuthorsBooks] ab1
JOIN dbo.Authors a1 ON ab1.AuthorId = a1.Id
JOIN dbo.Books b1 ON ab1.BookId = b1.Id