Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在多对多关系联接中合并列值_Sql_Sql Server_Asp.net 3.5_Sql Server 2008 Express - Fatal编程技术网

Sql 在多对多关系联接中合并列值

Sql 在多对多关系联接中合并列值,sql,sql-server,asp.net-3.5,sql-server-2008-express,Sql,Sql Server,Asp.net 3.5,Sql Server 2008 Express,我有两个表,图书和作者,它们之间有多对多关系。通过第三个名为图书作者的表,我尝试使用内部联接列出每本书的所有作者书籍,以便在控件中显示它们,但是联接会导致多个重复行,因为每本书可能有多个作者,因此每个作者都有一行。 例如: book_title author b1 a1 b1 a2 解决这一问题的最佳方法是什么: book_title author b1

我有两个表,图书作者,它们之间有多对多关系。通过第三个名为图书作者的表,我尝试使用内部联接列出每本书的所有作者书籍,以便在控件中显示它们,但是联接会导致多个重复行,因为每本书可能有多个作者,因此每个作者都有一行。
例如:

book_title           author  
b1                    a1  
b1                    a2  
解决这一问题的最佳方法是什么:

book_title                author  
b1                        a1, a2  

也许是这样的:

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

如果只想在SQL中执行此操作,则需要一个子查询,该子查询将获取图书id并生成一个作者列表(如果需要,则为csv)。在另一个查询中使用该子查询,对于每个唯一的bookid它将返回书名和作者列表

如果您不介意不使用纯SQL,我建议您在当前获取的数据列表中进行迭代,并创建一个映射类型结构(book_title->authorList),在遍历过程中添加作者


最好的选择取决于您如何使用它的范围,但通常我会说sql路由是一种方法。

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

这里有一个替代方案,在您的情况下可能很容易实现,因为书籍的作者并不太多:

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语句中包含足够的作者

在数据库上使用子查询和字符串连接函数,然后提供作者列表作为唯一要显示的字符串。请看这些帖子:,这正是我要做的,但我无法理解SQL查询可以做到这一点。很抱歉没有时间将其全部写出来,但这是一个关于如何获取表格并将其转换为csv字符串的链接。如果将其转换为函数,则可以在查询内部使用它。只需将图书id传递给此函数,它将返回csv字符串,并对所有图书执行此操作。如果你知道你拥有的作者的最大数量,下面G.Linoff的文章也可以起作用。谢谢你,如果我需要的话,我将来可能会尝试一下,上面的文章暂时还不错。