sql - 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;
解决方案
您的内部和外部参考不匹配。您正在引用学生姓名来预订:
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;
推荐阅读
- python - 专注于多个小部件
- c++ - C++ 中 new 和 delete 的内存行为是什么?
- python - 为什么 PlotWidget 不能在 GridLayout 单元格中缩放?
- angular - ngx-bootstrap 预输入更改检测问题
- javascript - Chrome 调试器在没有断点的点上永久中断
- python - Python 文件夹结构 - ModuleNotFoundError
- linux - Android x86 Repo Init - 权限被拒绝
- vb.net - 在文本框 VB.Net 中调用子
- gradle - Gradle 6 迁移 settings.gradle.kts
- javascript - javascript cookie 在 angularjs 应用程序中过期时不会被删除