如何使用具有多个表的管道生成 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 输出的主要内容,如果未能解决你的问题,请参考以下文章