2017-07-20 18 views
4

我正在处理一些包含XML片段的行。如何在GROUP BY操作中聚合XML片段

我在他们目前的状态行是这样的:

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片段到父<Players>元素,所以输出会看像这样:

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> 

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

回答

4

只是我想这样

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; 
+0

根(“运动员”) –

+0

而且连接条件是内部子查询缺少“WHERE X.TeamId = T.TeamId” –

+0

@KannanKandasamy谢谢:) – Chanukya

1

尝试像这样

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('')也避免了额外的名称级别。