[英]SQL Server Concatenate GROUP BY
我有一個看起來像這樣的查詢
SELECT J.JobID,T.Title FROM JobsTagMap J
Left Join Tags T
ON J.TagID=T.TagID
返回如下數據集(簡而言之,JobID實際上是一個UniqueIdentifier)
JobID Title
1 Tag1
1 Tag2
2 Tag2
2 Tag5
2 Tag9
現在,我想按 JobID 列對其進行分組並連接標題,因此結果如下
JobID Title
1 Tag1,Tag2
2 Tag2,Tag5,Tag9
我該怎么做?
如果您使用的是 sql server 2005+。 然后你可以這樣做:
SELECT
JobsTagMap.JobID,
STUFF
(
(
SELECT
',' +Title
FROM
Tags
WHERE
Tags.TagID=JobsTagMap.TagID
FOR XML PATH('')
)
,1,1,'') AS Title
FROM JobsTagMap
編輯
因為您沒有向我們展示表結構和不同表中的數據。 這有點難知道。 所以我假設你的表結構看起來像這樣:
CREATE TABLE JobsTagMap
(
JobID INT,
TagID INT
)
CREATE TABLE Tags
(
TagID INT,
Title VARCHAR(100)
)
有了這個數據:
INSERT INTO JobsTagMap
VALUES(1,1),(1,2),(2,2),(2,4),(2,5)
INSERT INTO Tags
VALUES(1,'Tag1'),(2,'Tag2'),(3,'Tag2'),(4,'Tag5'),(5,'Tag9')
如果您正在獲取顯示的數據,則JobID
不能是唯一的。 您可能在某個位置擁有一個Job
表,它是唯一的。 如果您只想使用您顯示的這些表,那么您需要執行以下操作:
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY JobID ORDER BY JobID) AS RowNbr,
JobsTagMap.*
FROM
JobsTagMap
)
SELECT
*,
STUFF
(
(
SELECT
',' +Title
FROM
Tags
JOIN JobsTagMap
ON Tags.TagID=JobsTagMap.TagID
WHERE
JobsTagMap.JobID=CTE.JobID
FOR XML PATH('')
)
,1,1,'') AS Title
FROM
CTE
WHERE
CTE.RowNbr=1
這會給你這個結果:
1 1 1 Tag1,Tag2
1 2 2 Tag2,Tag5,Tag9
所以以后總是顯示什么表結構和它的數據。 這會給你更好的答案
我正是為此使用了標量函數。 會有一些純粹主義者認為 decry 永遠不應該使用基於行的操作,但是嘿,這是可行的,如果您只返回幾行,那么響應時間就可以了。
CREATE FUNCTION [dbo].[JoinMVText]
(
@sID int,
@fieldID tinyint
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @MVtextList varchar(max)
SELECT @MVtextList = COALESCE(@MVtextList + '; ', '') + docMVtext.value
FROM docMVtext with (nolock)
WHERE docMVtext.sID = @sID and fieldID = @fieldID
RETURN @MVtextList
END
我遇到了和你一樣的問題,我想出了如何解決慢子選擇的方法。
使用GROUP BY :
(70500 rows affected)
SQL Server Execution Times:
CPU time = 94 ms, elapsed time = 833 ms.
使用子選擇:
(70500 rows affected)
SQL Server Execution Times:
CPU time = 1469 ms, elapsed time = 2323 ms.
子選擇要慢 4 倍以上......
這是解決方案:
SELECT
J.JobID,
STRING_AGG(ISNULL(T.Title, ''), ',') as Title
FROM JobsTagMap J
LEFT JOIN Tags T ON J.TagID = T.TagID
GROUP BY J.JobID;
如果有什么不夠清楚,請告訴我:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.