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

如何在具有多种搜索模式的SQL中使用LIKE?

使用 SSIS 将具有多个表的单个 mdb 文件动态导入 SQL Server?

如何将 memsql 用于组合多个表的报告

具有多个要求用户输入的程序的 linux 管道

SQL如何把查询出来的多个表创建成一个临时表

如何使用 Unix(或 Windows)中的(最好是未命名的)管道将一个进程的标准输出发送到多个进程?