您沒有任何關聯[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的方法,以確保你不被特殊字符絆倒了,如果你不和你嘗試一個連擊">>"
和"<<"
你不會有">><<"
結束了,你可能會想,你會得到">><<"
,使一個更好的查詢將是:
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;
附註:無排序列,連接結果可能(將)每次運行都會改變。這會很重要嗎? –
這不是在這一點上。他們可以以任何順序顯示。 – Volearix