我希望从以下数据中生成SQL Server中的连接字符串,如下所示:
Table A | Table B:
|
LOC Acct ID | ID SN
ATL 60 1 | 1 100A
ATL 60 2 | 2 300B
DAL 61 3 | 3 600X
DAL 61 4 | 4 500H
结果:
LOC Acct SN
ATL 60 100A:300B
DAL 61 600X:500H
我已经看过使用STUFF功能&这篇文章How do I Create a Comma-Separated List using a SQL Query?,但我似乎并没有正确地解决这个问题。
任何帮助将不胜感激!
编辑:
这是我尝试过的&结果是所有SN连接起来;我错过了一些东西:
SELECT distinct
A2.LOC,
A2.Acct,
STUFF((SELECT ':'+ b.SN
FROM TableA a
JOIN TableB b ON b.ID = a.ID
GROUP BY a.acct
, b.sn
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') SN_List
FROM TableA a2
Results:
LOC Acct SN
ATL 60 100A:300B:500H:600X
ATL 60 100A:300B:500H:600X
DAL 61 100A:300B:500H:600X
DAL 61 100A:300B:500H:600X
答案 0 :(得分:0)
您不需要GROUP BY
。
您执行在子查询中需要WHERE
条件,以便将外部查询行中的Acct
值与您想要的值的子集相关联在内部查询中连接。
您需要在外部查询中的DISTINCT
之后添加SELECT
,因为TableA会重复这些值。
为了便于阅读并减少难以调试的奇怪行为,不应在子查询中重复使用表别名。如果从TableA重新选择,而不是使用外部查询的TableA中的行值,请使用类似a2
的内容而不是相同的a
别名。
以下按照您的SqlFiddle工作(在对此答案的评论中注明):
SELECT DISTINCT
A2.LOC,
A2.Acct,
STUFF((SELECT ':'+ b.SN
FROM TableA a
INNER JOIN TableB b
ON b.ID = a.ID
WHERE a.Acct = a2.Acct
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') SN_List
FROM TableA a2