【发布时间】:2014-11-05 13:30:17
【问题描述】:
抱歉,如果这里有答案,但我找不到它...您能否使用 FOR XML PATH 连接多个表中的行。让我解释一下……
我有以下 4 个表:
“BusinessSupport”,它引用了其他 3 个表
“Application”、“BusinessProcess”和“OrgaUnit”(包含服务线和地理等组织信息)
SELECT a.NAME AS [App Name],
STUFF((SELECT ',' + bp.NAME as [text()]
FROM BUSINESSPROCESS bp
LEFT JOIN BUSINESSSUPPORT bs on bp.REFSTR=bs.XOBJECT
WHERE bs.OBJECT=a.REFSTR FOR XML PATH('')), 1, 1, '' ) AS [Business Process] ,
STUFF((SELECT ',' + org.NAME as [text()]
FROM ORGAUNIT org
LEFT JOIN BUSINESSSUPPORT bs on org.REFSTR=bs.YOBJECT
WHERE bs.OBJECT=a.REFSTR FOR XML PATH('')), 1, 1, '' ) AS [Service Lines]
FROM APPLICATION a
这给了我表格结果,例如
应用名称; 业务流程; 服务热线
应用程序1;进程1,进程2,进程3; SL1、SL2、SL3
app2;进程1,进程2; SL1、SL4、SL4
app3;进程4,进程2; SL3、SL5、SL6
但是,我现在有一个新的维度,我被要求报告。 表 5 “Relations”,其中提到了 Business Support 和 Orgaunit。
我想要类似的东西
应用名称; 业务流程; 服务热线; 地理
应用程序1;进程1,进程2,进程3; SL1、SL2、SL3;地理1、地理2
app2;进程1,进程2; SL1、SL4、SL4;地理1、地理3
app3;进程4,进程2; SL3、SL5、SL6;地理3、地理4、地理5
我尝试了以下方法,但没有返回任何结果:
STUFF((SELECT ',' + org2.name as [text()]
FROM ORGAUNIT org2
LEFT JOIN RELATIONS rel ON rel.TOREF=org2.name
LEFT JOIN BUSINESSSUPPORT bs on bs.REFSTR=rel.FROMREF
WHERE bs.OBJECT=a.REFSTR FOR XML PATH('')), 1, 1, '' ) AS [Geog]
谢谢
【问题讨论】:
-
您是否检查过
STUFF中的SELECT确实返回了记录?你应该先让那个查询工作。 -
是的,查询没问题。如果我返回 A Geog ID 而不是 Geog 名称,则一切正常。但它没有额外的 JOIN 来获取 GEOG 名称 STUFF((SELECT ',' + rel.TOREF as [text()] FROM RELATIONS rel LEFT JOIN BUSINESSSUPPORT bs on bs.REFSTR=rel.FROMREF WHERE bs.OBJECT= a.REFSTR FOR XML PATH('')), 1, 1, '' ) AS [Geog ID]
-
请使用您用于测试的查询更新您的答案。
标签: sql sql-server concatenation