【问题标题】:How to aggregate XML snippets in GROUP BY operation如何在 GROUP BY 操作中聚合 XML 片段
【发布时间】:2017-07-20 12:32:35
【问题描述】:

我正在处理一些包含 XML sn-ps 的行。

我当前状态下的行如下所示:

TeamId     Player
----------------------------------------------------------------------------
1   |  <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player>
1   |  <Player><FirstName>Sam</FirstName><LastName>Jones</LastName></Player>
2   |  <Player><FirstName>David</FirstName><LastName>White</LastName></Player>
2   |  <Player><FirstName>James</FirstName><LastName>Black</LastName></Player>

通过我的查询,我希望按 TeamId 对行进行分组,并将这些 XML sn-ps 聚合到父 &lt;Players&gt; 元素中,因此输出将如下所示:

1   | <Players>
        <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player>
        <Player><FirstName>Sam</FirstName><LastName>Jones</LastName></Player>
      </Players>  
2   | <Players>
        <Player><FirstName>David</FirstName><LastName>White</LastName></Player>
        <Player><FirstName>James</FirstName><LastName>Black</LastName></Player>
      </Players>

我应该怎么做? 非常感谢!

【问题讨论】:

    标签: sql sql-server xml group-by


    【解决方案1】:

    我就是这样尝试的

    CREATE TABLE #A
        (
        TEAMID INT,
        PLAYER XML 
        )
        INSERT INTO #A VALUES
        (1,'<PLAYER><FIRSTNAME>BOB</FIRSTNAME><LASTNAME>SMITH</LASTNAME></PLAYER>'),
        (1,'<PLAYER><FIRSTNAME>SAM</FIRSTNAME><LASTNAME>JONES</LASTNAME></PLAYER>'),
        (2,'<PLAYER><FIRSTNAME>DAVID</FIRSTNAME><LASTNAME>WHITE</LASTNAME></PLAYER>'),
        (2,'<PLAYER><FIRSTNAME>JAMES</FIRSTNAME><LASTNAME>BLACK</LASTNAME></PLAYER>')
    
    
    SELECT  T.TEAMID,
            (   SELECT  TEAMID ,
                        PLAYER
                FROM    #A AS X
                WHERE X.TeamId = T.TeamId
                FOR XML PATH('PLAYER'), TYPE, ROOT('PLAYERS')
    
            ) AS XML_FORMAT_STRING
    FROM    #A AS T
    GROUP BY T.TEAMID;
    

    【讨论】:

    • 根('玩家')
    • 子查询'WHERE X.TeamId = T.TeamId'中也缺少连接条件
    • @KannanKandasamy 谢谢:)
    • 这几乎完全正确 - 但每个玩家周围都有一个额外的 &lt;PLAYER&gt; 元素 - 你知道如何消除它吗?感谢您到目前为止的帮助:)
    【解决方案2】:

    这样试试

    SELECT  tbl.TeamId,
            (   SELECT Player AS [*]
                FROM   YourTable AS X
                WHERE X.TeamId = tbl.TeamId
                FOR XML PATH(''), TYPE, ROOT('Players')
            ) AS [*]
    FROM    YourTable AS tbl
    GROUP BY tbl.TeamId;
    

    别名AS [*] 告诉引擎按原样插入给定元素。这避免了额外的名称级别。空的PATH('') 也避免了额外的名称级别。

    【讨论】:

      猜你喜欢
      • 2014-11-22
      • 2014-12-27
      • 2017-03-12
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2019-12-10
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多