2010-11-29 64 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 
相關問題