1

我有如下表:串聯值

Code Ref  Value 
A1  Car  A 
A1  Car  - 
A1  Car  B 
B2  Truck CC 
B2  Truck D 
B2  Truck - 
C3  Van  E 
C3  Van  F 
C3  Van  - 
C3  Van  G 

我試圖完成的目標,是一個連接字符串,把所有值的這樣在一起:

Code Ref Value 
A1  Car A-B 
B2  Truck CCD- 
C3  Van EF-G 

我走了示例here,但沒有得到任何好處。這是我想出的:

SELECT [Table].[Code] 
, [Table].[Ref] 
, STUFF((SELECT DISTINCT [Value] 
    FROM [Table2] 
    FOR XML PATH ('')),1, 1,'') AS Values 
FROM [Table] 
LEFT JOIN [Table2] ON 
[Table2].[Code] = [Table].[Code] 

我在哪裏出錯了?有沒有更有效的方法來做到這一點?

+0

附註:無排序列,連接結果可能(將)每次運行都會改變。這會很重要嗎? –

+0

這不是在這一點上。他們可以以任何順序顯示。 – Volearix

回答

3

您沒有任何關聯[Table]的內部和外部引用,並且您還需要使外部引用不同。最後,你需要你的子查詢中要麼沒有列名,或者它需要[text()]

SELECT [Code] 
     ,[Ref] 
     ,STUFF((SELECT DISTINCT [Value] AS [text()] 
       FROM [Table] AS T2 
       WHERE T1.Code = T2.Code -- LINK HERE 
       AND T2.Ref = T2.Ref  -- AND HERE 
       FOR XML PATH ('') 
       ),1, 1,'') AS [Values] 
FROM [Table] AS T1 
GROUP BY T1.Code, T1.Ref; -- GROUP BY HERE 

順便說一句,你不需要使用STUFF你有沒有分隔符,STUFF通常用於去除從字符串的開頭選擇分隔符。所以當你有像,value1,value2,value3這樣的字符串時,STUFF(string, 1, 1, '')會將第一個字符替換爲'',而value1,value2,value3則會給你。

你也應該使用value XQuery的方法,以確保你不被特殊字符絆倒了,如果你不和你嘗試一個連擊">>""<<"你不會有">><<"結束了,你可能會想,你會得到"&gt;&gt;&lt;&lt;",使一個更好的查詢將是:

SELECT t1.Code, 
     t1.Ref, 
     [Values] = (SELECT DISTINCT [text()] = [Value] 
        FROM [Table] AS t2 
        WHERE T1.Code = T2.Code 
        AND  T2.Ref = T2.Ref 
        FOR XML PATH (''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
FROM [Table] AS T1 
GROUP BY t1.Code, t1.Ref; 

附錄

巴sed最新編輯的問題,看起來好像你的Value列來自另一個表,鏈接到第一個表Code。如果有的話,這使得你的查詢更簡單。你不需要JOIN,但你仍然需要確保有一個表達式將外部表與你的子查詢的內部表連接起來。我假設行是第一臺獨一無二的,所以你可能不需要組有兩種方法:

SELECT t1.Code, 
     t1.Ref, 
     [Values] = (SELECT DISTINCT [text()] = t2.[Value] 
        FROM [Table2] AS t2 
        WHERE T1.Code = T2.Code 
        FOR XML PATH (''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
FROM [Table] AS T1; 

工作例

CREATE TABLE #Table1 (Code CHAR(2), Ref VARCHAR(10)); 
INSERT #Table1 VALUES ('A1', 'Car'), ('B2', 'Truck'), ('C3', 'Van'); 

CREATE TABLE #Table2 (Code CHAR(2), Value VARCHAR(2)); 
INSERT #Table2 
VALUES ('A1', 'A'), ('A1', '-'), ('A1', 'B'), 
     ('B2', 'CC'), ('B2', 'D'), ('B2', '-'), 
     ('C3', 'F'), ('C3', '-'), ('C3', 'G'); 

SELECT t1.Code, 
     t1.Ref, 
     [Values] = (SELECT DISTINCT [text()] = t2.[Value] 
        FROM #Table2 AS t2 
        WHERE T1.Code = T2.Code 
        FOR XML PATH (''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
FROM #Table1 AS T1; 
+0

好吧,得到這個工作,現在如果在't2'中有一個索引需要排序,我該怎麼做呢?我收到一個錯誤'ORDER BY項目必須出現在選擇列表中,如果指定了SELECT DISTINCT'。當我添加'ORDER BY t2.Index'時,如果我把這部分弄清楚,那就是我需要的答案。 – Volearix