回答

收藏

连接行值T-SQL

技术问答 技术问答 81 人阅读 | 0 人回复 | 2023-09-13

我正在尝试将一些数据汇总为一个报告,并且需要连接表之一的行值。这是基本的表结构:6 }$ ~7 }4 |0 `3 r" k
评论) W2 k, y& K! P& v/ n( i( S
ReviewID  ! I& E) A. \% c" Y& |6 |
ReviewDate9 h% |" q* T8 V+ g! X3 e9 P! D
审稿人
$ [$ d6 u. E4 a  ~9 K6 l% M5 ]8 L ReviewerID  
+ [  e. |/ V0 e7 P3 @ ReviewID  : z: N0 m9 P8 m4 a# H
UserID
4 s, Y, `2 v* `- W4 N/ U用户数
% e  Q; F- f! @) C& o* MUserID  
8 i  t4 F; M% h4 k' F2 rFName  
* |5 ?6 w) Y! h4 V# DLName, @; a4 E5 m1 q9 L- H" h- @
这是M:M关系。每个审阅可以有许多审阅者;每个用户可以与许多评论相关联。
) y5 B3 {9 J4 {" _* _/ i基本上,我要查看的是Reviews.ReviewID,Reviews.ReviewDate和该评论的所有关联用户的FName的串联字符串(以逗号分隔)。
0 O3 a  Y- J' V" q代替:8 H/ @# i8 F$ N# F, k) X) F
ReviewID---ReviewDate---User  
" N; D- V" ]8 t. T3 f1----------12/1/2009----Bob  6 h- k$ l& t; j4 L
1----------12/1/2009----Joe  
( j  ?) G1 ^7 D" z1----------12/1/2009----Frank  
4 O  H" u/ R; C* ?* l1 B2----------12/9/2009----Sue  
" j- ^# ?: r* e" f3 u2----------12/9/2009----Alice. |# \" }! c: |1 j$ [
显示此:# v/ i. k) M+ P) M( x
ReviewID---ReviewDate----Users  " H0 p* ~, p. j' e5 U% J
1----------12/1/2009-----Bob, Joe, Frank  
, J5 f/ ^# d+ s: |7 s2----------12/9/2009-----Sue, Alice2 {9 K- M0 F( o" z- Q
我发现这个文章描述了一些方法可以做到这一点,但大多数的这些似乎只与一个表,而不是多个处理;0 `! L8 K" y& g: r! I0 Q3 ]4 u
不幸的是,我的SQL-fu不够强大,无法适应我的情况。我对该站点上使用FOR XML PATH()的示例特别感兴趣,因为它看起来最干净,最直接。
& U% g& i2 Y+ O0 Z, A$ T# ASELECT p1.CategoryId,
/ G: U3 W3 g' d$ S2 r% V3 o( SELECT ProductName + ', '
+ r; E/ A& ]9 d% P9 p3 E$ O  FROM Northwind.dbo.Products p2
) Z: s9 k) J& n/ [6 N( a% g7 S  WHERE p2.CategoryId = p1.CategoryId
  k: @8 h0 P0 }* ~" }- N  ORDER BY ProductName FOR XML PATH('')
% d# w/ C  L5 }$ T3 T) N, K) {# M) AS Products, V; i, e. U4 E3 p7 ]+ Q
FROM Northwind.dbo.Products p1
9 k5 ]/ ]9 ]# HGROUP BY CategoryId;* T. p' B# x7 F# n. V) L
谁能帮我这个忙吗?任何帮助将不胜感激!/ u; k1 t5 O) Z
                7 T0 v& z3 m; d2 }% g
解决方案:- \3 |( L1 f' Y6 W
                " D. ~9 Q5 [8 o: b: |8 C# I
' m8 Y: a- E" p$ X! E% j6 V$ n

8 ^0 S  U0 [' S, k% @                看看这个
- Q. y! }6 F" rDECLARE @Reviews TABLE(7 p1 U/ [; u. Y- y- W
        ReviewID INT,; S# N0 S$ w" {3 C8 y$ E$ C
        ReviewDate DATETIME' v% ^0 v* ~) M
)
! D/ m3 ?6 N: }5 m4 IDECLARE @Reviewers TABLE(
, ]4 K) E- V' x5 m+ l% ~        ReviewerID   INT,2 o7 T$ V( |  V! {9 {
        ReviewID   INT,6 T/ M9 B) x4 l* I8 H. D6 e- J- x: k* E. I
        UserID INT: S! C( t: r1 L) Y- R
)1 I6 @+ r$ T' t' f, ?
DECLARE @Users TABLE(4 W  g8 J' [' Y0 B/ q$ M
        UserID  INT,3 i/ N8 a  w8 M# A
        FName  VARCHAR(50),, n5 M: j9 @$ B( C
        LName VARCHAR(50)
5 o1 n5 m1 v3 E)
* a! u9 A5 T$ k7 e; M6 d7 JINSERT INTO @Reviews SELECT 1, '12 Jan 2009'6 r9 V( t; N( p" x* A0 f& F! D. X
INSERT INTO @Reviews SELECT 2, '25 Jan 2009'
8 i8 Y& O5 O1 ?1 y  gINSERT INTO @Users SELECT 1, 'Bob', ''
1 ^" @! m, j3 r, k3 {INSERT INTO @Users SELECT 2, 'Joe', ''
) m4 N9 ~8 r# a6 x5 x# LINSERT INTO @Users SELECT 3, 'Frank', ''* V. E8 x- N3 n! C' L3 u
INSERT INTO @Users SELECT 4, 'Sue', ''
  x8 p3 X# \& ^INSERT INTO @Users SELECT 5, 'Alice', ''' Q' v5 n) `& k( i' s* }
INSERT INTO @Reviewers SELECT 1, 1, 19 h5 B9 m9 L% j. K4 u: h6 V8 u
INSERT INTO @Reviewers SELECT 2, 1, 29 S( P7 ]" c2 H0 Y% h0 p# ^
INSERT INTO @Reviewers SELECT 3, 1, 3( ?/ F+ Z5 U2 r
INSERT INTO @Reviewers SELECT 4, 2, 4
+ H1 H$ i! Y/ |# l( z' QINSERT INTO @Reviewers SELECT 5, 2, 54 J# J/ t/ R1 m1 Y7 ?) k7 Z
SELECT  *,! l% y5 T/ l3 v: H/ s( S
        ( ( N. j7 x/ z  s! a
            SELECT  u.FName + ','
- i8 \4 b& H. J, P4 O            FROM    @Users u INNER JOIN
3 C, t7 g9 x. V8 D) _* X                    @Reviewers rs ON u.UserID = rs.UserID
, u% o4 I9 \/ a/ N: ~3 H            WHERE   rs.ReviewID = r.ReviewID( n2 B) {0 V0 y# Z4 a
            FOR XML PATH('')
' P) `. w! e  S5 @( S        ) AS Products
; S- d$ ^) A7 B- p- e$ S/ z6 k: R' g- y* pFROM    @Reviews r
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则