5

我有两个表,BooksAuthors ,它们之间通过名为book_authors的第三个表具有多对多关系,我正在尝试使用内部连接列出每本书的作者的所有书籍,以便将它们显示在DataList控件,但是连接导致了几个重复的行,因为每本书可能有很多作者,所以每个作者都会有一行。
例子:

book_title           author  
b1                    a1  
b1                    a2  

解决此问题的最佳方法是什么,使其变为:

book_title                author  
b1                        a1, a2  
4

3 回答 3

6

也许是这样的:

SELECT
    Books.book_title,
    STUFF
    (
        (
            SELECT 
                ',' +author
            FROM
                book_authors
                JOIN Authors
                    ON book_authors.authorId=Authors.authorId
            WHERE
                book_authors.bookId=Books.bookid
            FOR XML PATH('')
        )
    ,1,1,'')
FROM
    Books

编辑

没有你的数据很难说。这是否有效:

DECLARE @Table1 TABLE(ID INT)
DECLARE @Table2 TABLE(Name varchar(100),ID INT)

INSERT INTO @Table1 VALUES(1),(2)
INSERT INTO @Table2 VALUES('test1',1),('test2',1),('test3',2),('test4',2)

SELECT
    t1.ID,
    STUFF
    (
        (
            SELECT 
                ',' +t2.Name
            FROM
                @Table2 AS t2
            WHERE
                t1.ID=t2.ID
            FOR XML PATH('')
        )
    ,1,1,'')
FROM
    @Table1 AS t1
于 2012-05-11T12:27:43.223 回答
1

如果您想纯粹在 SQL 中执行此操作,那么您将需要一个子查询,该查询将获取图书 ID 并生成作者列表(如果您想要的话,则为 csv)。在另一个查询中使用该子查询,对于每个唯一的 bookid,它都会返回 book_title 和 author 列表。

如果您不介意不使用纯 SQL,我会说只需遍历您当前正在获取的 DataList 并制作一个地图类型的结构(book_title -> authorList),然后在您浏览时添加作者。

最佳选择取决于您使用它的范围,但通常我会说 sql 路由是要走的路。

于 2012-05-11T12:46:37.497 回答
1

您要做的是字符串聚合连接。关于这个主题有一些非常好的帖子。

这是一种替代方法,在您的情况下可能很容易,因为书籍没有太多作者:

select b.name,
       (max(case when authornum = 1 then author else '' end) +
        max(case when authornum = 2 then ', '+ author else '' end) +
        max(case when authornum = 3 then ', '+ author else '' end)
       ) as authors
 from (select ba.*,
              row_number() over (partition by bookid order by authorid) as authornum
       from BookAuthors ba
      ) bajoin
      Authors a
      on a.authorid = ba.authorid join
      Books b
      on b.bookid = ba.bookid
 group by b.name

您只需要确保在 select 语句中包含足够多的作者。

于 2012-05-11T13:31:41.187 回答