【问题标题】:Using FOR XML to Concatenate multiple fields使用 FOR XML 连接多个字段
【发布时间】:2018-11-21 18:32:57
【问题描述】:

我的数据结构如下:

我正在尝试使用 STUFF/FOR XML PATH 来连接字段。

如果我使用我在网上找到的示例,我可以得到以下结果:

但我想知道以下是否可能:

我目前通过两次调用 FOR XML PATH 来实现这一点,首先是连接 Header3:

然后再次获得所需的结果。

有没有办法在不调用 XML PATH 两次的情况下做到这一点?

【问题讨论】:

    标签: sql sql-server tsql for-xml-path


    【解决方案1】:

    你在寻找类似的东西

    CREATE TABLE T(
      Header1 INT,
      Header2 VARCHAR(45),
      Header3 VARCHAR(45)
    );
    
    INSERT INTO T VALUES
    (123, 'A', 'aaa'),
    (123, 'B', 'bbb'),
    (123, 'C', 'ccc'),
    (123, 'C', 'ddd'),
    (456, 'E', 'eee');
    
    WITH H3 AS
    (
      SELECT DISTINCT Header1, Header2,
             STUFF(
               (
                 SELECT ',' + Header3
                 FROM T
                 WHERE Header2 = H2.Header2
                 FOR XML PATH('')
               ), 1, 1, ''
             ) Res
    FROM T H2
    )
    
    SELECT DISTINCT
           Header1,
           STUFF(
             (SELECT ' '+ Header2 + ':' + Res + '|'
              FROM H3
              WHERE Header1 = TT.Header1
              FOR XML PATH('')
             ), 1, 1, ''
           ) Desired
    FROM H3 TT;
    

    返回:

    +---------+--------------------------+
    | Header1 |         Desired          |
    +---------+--------------------------+
    |     123 | A:aaa| B:bbb| C:ccc,ddd| |
    |     456 | E:eee|                   |
    +---------+--------------------------+
    

    Demo

    【讨论】:

    • 我是。这比我当前的查询更清晰,所以谢谢。但我希望看看是否可以在不调用 FOR XML 两次的情况下完成。
    • @DCulley,这个结构实际上是一个双重的1:n 关系(这清楚地表明了这样一个事实,即这需要不同的表格设计)。但是,您需要某种连接或(相关的)子查询来收集所有相关的Header2 数据,并需要一个步骤将相关的Header3 数据绑定到它们对应的Header2。这可能会在您的表示层中得到更好的解决...
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多