将来自另一个 table 的所有匹配值放入单个列中的查询
Query that puts into a single column all of the matching values from another table
我需要一个查询,将来自另一个 table 的所有匹配值放入单个列中。
我有三个 table 可以跟踪人们的日程安排。
一个人 table 一个会话 table 和一个外部参照 table 的时间表。
Person Table
---------------------
PersonID FirstName
--------- ---------
167196 Mark
SessionLive Table
-------------------------
SessionCode SessionAtLocationID
----------- -------------------
T4182 8105
T4183 8106
T4190 8113
T4179 8102
XPersonSchedule Table of the Persons schedule
-------------------------------------------------
PersonID SessionAtLocationID
----------- -------------------
167196 8105
167196 8106
167196 8113
167196 8102
这个select:
select Person.RecordNumber as PersonID, Person.FirstName
, SessionLive.SessionCode
from Person
join XPersonSchedule on XPersonSchedule.PersonID = RecordNumber
join SessionLive on
SessionLive.SessionAtLocationID = XPersonSchedule.SessionAtLocationId
where recordnumber = 167196
给我这个:
PersonID FirstName SessionCode
----------- ----------- ----------
167196 Mark T4182
167196 Mark T4183
167196 Mark T4190
167196 Mark T4179
我需要一个 select 来代替这个。
每个人一行,他们的会话在一列中 cr/lf 分隔。
PersonID FirstName SessionCode
----------- ----------- -----------
167196 Mark T4182<crlf>T4183<crlf>T4190<crlf>T4179
拜托!谢谢!
这在 SQL 服务器的旧 life-support 版本中是一个非常丑陋的解决方案:
SELECT PersonID = p.RecordNumber, p.FirstName,
SessionCodes = STUFF((
SELECT CONCAT(char(13),char(10),sl.SessionCode)
FROM dbo.SessionLive AS sl
INNER JOIN dbo.XPersonSchedule AS xps
ON sl.SessionAtLocationID = xps.SessionAtLocationID
WHERE xps.PersonID = p.RecordNumber
FOR XML PATH(''), TYPE
).value(N'./text()[1]', N'varchar(max)'), 1, 2, '')
FROM dbo.Person AS p
GROUP BY p.RecordNumber, p.FirstName;
输出:
PersonID
FirstName
SessionCodes
167196
Mark
T4182
T4183
T4190
T4179
这在较新的版本中稍微简单一些(有关背景,请参阅 String Aggregation Over the Years in SQL Server):
SELECT PersonID = p.RecordNumber, p.FirstName,
SessionCodes = STRING_AGG(sl.SessionCode, char(13)+char(10))
FROM dbo.SessionLive AS sl
INNER JOIN dbo.XPersonSchedule AS xps
ON sl.SessionAtLocationID = xps.SessionAtLocationID
INNER JOIN dbo.Person AS p
ON xps.PersonID = p.RecordNumber
GROUP BY p.RecordNumber, p.FirstName;
我需要一个查询,将来自另一个 table 的所有匹配值放入单个列中。
我有三个 table 可以跟踪人们的日程安排。 一个人 table 一个会话 table 和一个外部参照 table 的时间表。
Person Table
---------------------
PersonID FirstName
--------- ---------
167196 Mark
SessionLive Table
-------------------------
SessionCode SessionAtLocationID
----------- -------------------
T4182 8105
T4183 8106
T4190 8113
T4179 8102
XPersonSchedule Table of the Persons schedule
-------------------------------------------------
PersonID SessionAtLocationID
----------- -------------------
167196 8105
167196 8106
167196 8113
167196 8102
这个select:
select Person.RecordNumber as PersonID, Person.FirstName
, SessionLive.SessionCode
from Person
join XPersonSchedule on XPersonSchedule.PersonID = RecordNumber
join SessionLive on
SessionLive.SessionAtLocationID = XPersonSchedule.SessionAtLocationId
where recordnumber = 167196
给我这个:
PersonID FirstName SessionCode
----------- ----------- ----------
167196 Mark T4182
167196 Mark T4183
167196 Mark T4190
167196 Mark T4179
我需要一个 select 来代替这个。 每个人一行,他们的会话在一列中 cr/lf 分隔。
PersonID FirstName SessionCode
----------- ----------- -----------
167196 Mark T4182<crlf>T4183<crlf>T4190<crlf>T4179
拜托!谢谢!
这在 SQL 服务器的旧 life-support 版本中是一个非常丑陋的解决方案:
SELECT PersonID = p.RecordNumber, p.FirstName,
SessionCodes = STUFF((
SELECT CONCAT(char(13),char(10),sl.SessionCode)
FROM dbo.SessionLive AS sl
INNER JOIN dbo.XPersonSchedule AS xps
ON sl.SessionAtLocationID = xps.SessionAtLocationID
WHERE xps.PersonID = p.RecordNumber
FOR XML PATH(''), TYPE
).value(N'./text()[1]', N'varchar(max)'), 1, 2, '')
FROM dbo.Person AS p
GROUP BY p.RecordNumber, p.FirstName;
输出:
PersonID | FirstName | SessionCodes |
---|---|---|
167196 | Mark | T4182 T4183 T4190 T4179 |
这在较新的版本中稍微简单一些(有关背景,请参阅 String Aggregation Over the Years in SQL Server):
SELECT PersonID = p.RecordNumber, p.FirstName,
SessionCodes = STRING_AGG(sl.SessionCode, char(13)+char(10))
FROM dbo.SessionLive AS sl
INNER JOIN dbo.XPersonSchedule AS xps
ON sl.SessionAtLocationID = xps.SessionAtLocationID
INNER JOIN dbo.Person AS p
ON xps.PersonID = p.RecordNumber
GROUP BY p.RecordNumber, p.FirstName;