|
考虑一个包含名称的数据库表,该表具有三行:
6 M2 I5 C' @! ]( n; f$ g# u0 ^ D1 h6 fPeter
1 H% e' `* p. _' ^& F) M0 UPaul
! D9 x+ l& f4 C# wMary
0 I: r) A1 k3 y9 f6 s9 d0 ^& O
/ m$ g$ e% v3 z% A ~3 g有没有简单的方法可以将其转换为单个字符串Peter, Paul, Mary?& u! |/ L' P/ I8 b4 h! V
9 w3 G8 ~' D q% b; |8 ?: u
解决方案:- g$ k, k7 b+ M- w' h" m' U& G! a
4 ?, u% a3 P; C1 A3 M6 h
! Z4 j( U+ }. O5 Q5 O) ]: a U7 A( V/ G
如果您使用的是SQL Server 2017或Azure,请参阅Mathieu Renda的答案。! n3 B8 _& t9 P9 ^
当我尝试将两个具有一对多关系的表联接在一起时,我遇到了类似的问题。在SQL 2005中,我发现该XML PATH方法可以非常轻松地处理行的串联。
: A6 ~3 L- X4 d- h! Z如果有一个表叫做 STUDENTS
2 ^5 p* {- g) l0 z' W( GSubjectID StudentName$ i, o5 G' M% B' Q6 K( K
---------- -------------
4 h3 u4 j$ b) ~$ T7 \1 u# ?! H1 Mary! V. H& Z2 G+ z5 K9 s
1 John
# R; V3 e# b$ {1 Sam6 k! ~" {; ^0 s; h9 u2 c
2 Alaina0 s' ]. ~, b% f) j
2 Edward9 z% o9 C3 B* M2 h6 J- H) m) c0 |
/ s$ B: ~. s" `, `我预期的结果是:
: w9 x* B& R( M) J! VSubjectID StudentName
: f m# K% @- {/ g---------- -------------0 w3 N' ?) o+ O9 \
1 Mary, John, Sam* J( K) x0 r& ?
2 Alaina, Edward) X0 ]; R, S# G) |4 I3 i* ?$ l
, I$ |9 T9 P# s! O0 I& N& @
我使用了以下内容T-SQL:
5 L1 ~! n6 R# ~; `0 \SELECT Main.SubjectID,* ?" \, z: O! T. Y, ]( L$ R& F
LEFT(Main.Students,Len(Main.Students)-1) As "Students"( ?$ } o. f: ?: @$ [+ T9 d" v0 C
FROM
' X- F- D5 \/ K (
1 v2 |4 C; V* H SELECT DISTINCT ST2.SubjectID,
; L- V) z* L: ?4 A8 J a0 ~ (4 \7 q2 ]6 B4 L' Z$ m
SELECT ST1.StudentName + ',' AS [text()]- A+ N6 b0 c5 T: f& }
FROM dbo.Students ST1, D! E5 t" H' T$ G5 T( p
WHERE ST1.SubjectID = ST2.SubjectID( c$ B$ @2 b$ P6 l& {" I! P, B
ORDER BY ST1.SubjectID
. n4 }, `5 D' v9 \# h5 ? FOR XML PATH ('')6 v# H) D7 ^1 n
) [Students]5 r# W, B' r) R& I
FROM dbo.Students ST2
, p$ N5 O7 D" S2 Q8 W ) [Main]$ C- S. [+ O( e$ C' R
[. r. T2 l* ?
如果可以在开头合并逗号并用于substring跳过第一个逗号,则可以以更紧凑的方式执行相同的操作,因此您无需执行子查询:; |) T+ A; h Q4 n- ^
SELECT DISTINCT ST2.SubjectID, ) X& o7 K1 _$ j+ p( L4 ?
SUBSTRING(
& s( E: D0 S m( L$ ]( s (4 a, y1 `( Y/ x
SELECT ','+ST1.StudentName AS [text()]+ _" g! X& u' W; B
FROM dbo.Students ST1
& y/ E7 h7 s3 U- M6 o2 I/ J, J6 @ WHERE ST1.SubjectID = ST2.SubjectID
# y* D& I5 i; L ORDER BY ST1.SubjectID4 p' f( y" g, K' ^
FOR XML PATH ('')0 v+ \" r$ Q* d c2 @& F4 [4 s8 R
), 2, 1000) [Students]
- x" ^( E& O4 g. Z4 S/ i3 ^ jFROM dbo.Students ST2 |
|