2010-11-29 66 views
0

情况:此表保存Documents表和Users表之间的关系信息。某些用户需要审阅或批准文档(类型)。如果需要的话,我希望将它放在一个可以让所有审阅者在一行的位置。所以,如果三个用户审阅文档1,然后连续将有346,394,519价值,这是因为它们的评审与另一列有关的一列中的多个值的SQL Server查询

表: xDocumentsUsers

DocID..UserID....Type... 
1........386......approver 
1........346......reviewer 
1........394......reviewer.. 
1........519......reviewer.. 
4........408......reviewer.. 
5........408......reviewer.. 
6........408......reviewer.. 
7........386......approver.. 
7........111......readdone.. 
7........346......reviewer.. 
8........386......approver.. 
8........346......reviewer.. 
9........386......approver.. 
9........346......reviewer.. 
10.......386......approver.. 
11.......386......approver.. 
11......346......reviewer.. 
12......386......approver.. 
12......346......reviewer.. 
13......386......approver.. 
13......346......reviewer.. 
14......386......approver.. 
14......346......reviewer.. 
15......386......approver 

因此,理想的结果是.. 。

DocID..UserID ................类型...

1........386....................approver 
1........346,394,519......reviewer. 
4........408....................reviewer.. 
5........408....................reviewer.. 
6........408....................reviewer.. 
7........386....................approver.. 
7........111....................readdone.. 
7........346....................reviewer.. 
8........386....................approver.. 
8........346....................reviewer.. 
9........386....................approver.. 
9........346....................reviewer.. 
10......386....................approver.. 
11......386....................approver.. 
11......346....................reviewer.. 
12......386....................approver.. 
12......346....................reviewer.. 
13......386....................approver.. 
13......346....................reviewer.. 
14......386....................approver.. 
14......346....................reviewer.. 
15......386....................approver 
+0

DECLARE @UsersID VARCHAR(100)选择@UsersID = COALESCE(@ UsersID +',','')+ CAST(UserID AS varchar(5))FROM xDocumentsUsers WHERE DocumentID = 1 SELECT @UsersID ...................... ........................获得这个结果:386,346,394,519 – sjpizzle 2010-11-29 19:57:27

回答

1

有无看看

Emulating MySQL’s GROUP_CONCAT() Function in SQL Server 2005

Is there a way to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?

一个简单的例子是

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50) 
) 
INSERT INTO @Table (ID,Val) SELECT 1, 'A' 
INSERT INTO @Table (ID,Val) SELECT 1, 'B' 
INSERT INTO @Table (ID,Val) SELECT 1, 'C' 
INSERT INTO @Table (ID,Val) SELECT 2, 'B' 
INSERT INTO @Table (ID,Val) SELECT 2, 'C' 

--Concat 
SELECT t.ID, 
     (
      SELECT tIn.Val + ',' 
      FROM @Table tIn 
      WHERE tIn.ID = t.ID 
      FOR XML PATH('') 
     ) 
FROM @Table t 
GROUP BY t.ID 
+0

我喜欢这个例子的工作方式,如果表格已经存在这意味着我可以使用后面的--Concat? – sjpizzle 2010-11-29 20:25:46

+0

是的,的确如此,这仅仅是一个示例,使用表变量 – 2010-11-30 04:19:59

0

这是否帮助?

SELECT DocID 
    , [Type] 
    , (SELECT CAST(UserID + ', ' AS VARCHAR(MAX)) 
     FROM [xDocumentsUsers] 
     WHERE (UserID = x1.UserID) 
     FOR XML PATH ('') 
    ) AS [UserIDs] 
FROM [xDocumentsUsers] AS x1 
2

FOR XML PATH是一个很好的解决方案。但是,您需要知道,它会将内部SELECTs结果集中的任何特殊字符转换为其xml等效项 - 即&将在XML结果集中变为&。通过在内部结果集周围使用REPLACE函数,您可以轻松地恢复到原始字符。若要从astander的前面的例子借用,它看起来像(注意选作第一个参数来替换功能被封闭在():

--Concat 
SELECT t.ID, 
    REPLACE((SELECT tIn.Val + ',' 
     FROM @Table tIn 
     WHERE tIn.ID = t.ID 
     FOR XML PATH('')), '&', '&')) 
FROM @Table t 
GROUP BY t.ID 
相关问题