【问题标题】:How to generate SQL output with pipes with multiple tables如何使用具有多个表的管道生成 SQL 输出
【发布时间】: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

现在我添加了另一个表,我遇到了麻烦。感谢您的帮助。

【问题讨论】:

标签: sql sql-server


【解决方案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?
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多