【问题标题】:Concatenate Rows using FOR XML PATH() from multiple tables使用来自多个表的 FOR XML PATH() 连接行
【发布时间】: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


【解决方案1】:

如果使用FOR XML 连接值时返回的任何列返回NULL,,那么整个连接的字符串将变为NULL,因为“某些字符串”+NULL 始终是NULL 是SQL Server .如果在您的示例中 org2.name 可能是 NULL,则将 ISNULL 包裹在连接的结果周围,并替换为空字符串。

STUFF((SELECT ISNULL(',' + 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]

【讨论】:

  • 谢谢。我理解逻辑,但是,当我调整代码时,使用 ISNull 不起作用:(即使将空字符串更改为随机字符串值仍然会给我一个 NULL 值?
  • a.REFSTR 添加到您的主查询结果集中,然后对于返回 NULL 的地理结果之一,尝试此查询以查看您得到的结果: SELECT org2.name as [ text()] FROM ORGAUNIT org2 左连接关系 rel ON rel.TOREF=org2.name 左连接 BUSINESSSUPPORT bs on bs.REFSTR=rel.FROMREF WHERE bs.OBJECT= {PutValue of a.refstr here};如果这返回 0 条记录,则说明您的子查询存在错误连接以返回地理名称的问题。
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2023-04-09
  • 2018-11-06
相关资源
最近更新 更多