如何使用具有多个表的管道生成 SQL 输出
Posted
技术标签:
【中文标题】如何使用具有多个表的管道生成 SQL 输出【英文标题】:How to generate SQL output with pipes with multiple tables 【发布时间】:2014-08-25 03:21:17 【问题描述】:我正在使用 SQL Server。
我有一张这样的学生表:
StudentID TeacherNumber
123 1
124 1
125 2
126 2
127 1
128 3
我也有一张这样的教师表:
TeacherNumber TeacherName
1 Adams
2 Johnson
3 Marks
我需要这样的输出:
TeacherNumber Teacher Students
1 Adams 123|124|127
2 Johnson 125|126
3 Marks 128
感谢您的帮助。谢谢。
我之前发布了一个类似的问题,并得到了一个有效的回复:
How to generate sql output as piped
现在我添加了另一个表,我遇到了麻烦。感谢您的帮助。
【问题讨论】:
***.com/questions/451415/… 你试过什么?请编辑您的问题并将您尝试过的任何代码放入问题中(即使它不起作用)。 【参考方案1】:小提琴:
http://sqlfiddle.com/#!6/27600/29/0
查询:
select distinct st1.teachernumber,
teachername as teacher,
stuff(( select '|' + cast(st2.studentid as varchar(20))
from students st2
where st1.teachernumber = st2.teachernumber
order by st2.studentid
for xml path('')
),1,1,'') as students
from students st1
join teachers t
on st1.teachernumber = t.teachernumber
我必须将 STUDENTID 转换为 VARCHAR 的原因是,通过添加管道字符,数据类型将不再有效,并且会出现错误。您必须将其转换为 varchar 才能使管道分隔符与整数字段一起使用(我假设 STUDENTID 是一个 INT 字段)。
输出:
| TEACHERNUMBER | TEACHER | STUDENTS |
|---------------|---------|-------------|
| 1 | Adams | 123|124|127 |
| 2 | Johnson | 125|126 |
| 3 | Marks | 128 |
【讨论】:
完美!非常感谢。有没有办法摆脱尾管?所以不是 123|124|127|应该是 123|124|127 @user3513237 是的,我刚刚更新了答案,您可以将“,1,1,'') 更改为学生”以砍掉 1 前导 1 尾随。在我没有砍掉最后一个尾随字符之前。 我在我的 SQL Server 2008 机器上运行它时遇到问题。查询已经运行了 3 分钟,还没有结果... @user3513237 桌子有多大?教师编号是否已编入索引和/或 PK?以上是关于如何使用具有多个表的管道生成 SQL 输出的主要内容,如果未能解决你的问题,请参考以下文章