首页 > 解决方案 > SQL Query 结果集输出为使用逗号的单行

问题描述

我有这 3 个表格,如下所示。

    Table: Student
        -------------
        |  ID | Name| 
        +-----+-----+
        | S01 |Alex |
        | S02 |Sam  |
        | S03 |May  |
        -------------

    Table: Book
        --------------
        |  ID | Name | 
        +-----+------+
        | B01 |BookA |
        | B02 |BookB |
        | B03 |BookC |
        --------------

    Table:StudentBooks
        --------------
        |  SID| BID  | 
        +-----+------+
        | S01 |B01   |
        | S02 |B02   |
        | S01 |B03   |
        | S02 |B03   |
        --------------

这是我想要得到的输出。

    -----------------------
    |  Name |     Book    | 
    +-------+-------------+
    | Alex  |BookA, Book C|
    | Sam   |BookB, Book C|
    | May   |             |
    -----------------------

我尝试使用以下代码,但似乎无法根据学生姓名获得正确的书名。我目前的输出是所有书籍都显示在每一行中,包括名为“May”的学生,该学生未分配任何书籍。

SELECT s.Name AS Name,
       STUFF((SELECT ',' + b.Name
              FROM StudentBook sb
                   JOIN Student s ON s.ID = sb.SID
                   JOIN Book b ON b.ID = sb.BID
              WHERE s.Name = s.Name
             FOR XML PATH('')),1,1,'') AS Book
FROM StudentBooks sb
     JOIN Book b ON b.ID = sb.BID
     JOIN Student s ON s.ID = sb.SID;

标签: sqlsql-server

解决方案


您的内部和外部参考不匹配。您正在引用学生姓名来预订:

SELECT s.Name AS Name,
       STUFF((SELECT ',' + b.Name
              FROM StudentBook sb JOIN 
                   Book b 
                   ON b.ID = sb.BID
              WHERE sb.sid = s.id
              FOR XML PATH('')
              ), 1, 1, ''
             ) AS Book
FROM Student s;

推荐阅读