使用 Concat 方法优化查询
Optimize query using Concat method
我有一个使用 join 的查询,然后是 group by caseId
,然后是一个使用 STUFF
.
的类似 concat 的函数
SELECT distinct [CaseID], STUFF((SELECT ';' +space(1)+ A.[AssignedPathologist]+' ' FROM CTE1 A
WHERE A.[CaseID]=B.[CaseID] FOR XML PATH('')),1,1,'') As [AssignedPathologist]
From CTE1 B
Group By [CaseID]
问题是这个查询非常非常慢,我尝试使用 CONCAT
来优化它。
SELECT distinct A.[CaseID], [AssignedPathologist] = CASE A.AssignedPathologist = B.AssignedPathologist
WHEN 1 THEN A.AssignedPathologist
ELSE CONCAT(A.AssignedPathologist, ' ', B.AssignedPathologist)
END
FROM CTE1 A
INNER JOIN CTE1 B ON A.[CaseID]=B.[CaseID]
END
但它给我语法错误
[AssignedPathologist] = CASE A.AssignedPathologist = B.AssignedPathologist
这是合乎逻辑的,因为我在这里使用了两次 =
。
有什么方法可以使用 CONCAT 或其他方法优化我的查询吗?
谢谢
我会试试这个:
SELECT [CaseID],
STUFF( (SELECT CONCAT('; ', A.[AssignedPathologist])
FROM CTE1 A
WHERE A.[CaseID] = B.[CaseID]
FOR XML PATH('')
),1, 1, ''
) As [AssignedPathologist]
FROM (SELECT DISTINCT CaseID CTE1 B) B;
对于较新的版本,您可以使用 string_agg()
:
SELECT CASEID, STRING_AGG(AssignedPathologist, '; ') AS AssignedPathologist
FROM CTE1 C1
GROUP BY CASEID;
我有一个使用 join 的查询,然后是 group by caseId
,然后是一个使用 STUFF
.
SELECT distinct [CaseID], STUFF((SELECT ';' +space(1)+ A.[AssignedPathologist]+' ' FROM CTE1 A
WHERE A.[CaseID]=B.[CaseID] FOR XML PATH('')),1,1,'') As [AssignedPathologist]
From CTE1 B
Group By [CaseID]
问题是这个查询非常非常慢,我尝试使用 CONCAT
来优化它。
SELECT distinct A.[CaseID], [AssignedPathologist] = CASE A.AssignedPathologist = B.AssignedPathologist
WHEN 1 THEN A.AssignedPathologist
ELSE CONCAT(A.AssignedPathologist, ' ', B.AssignedPathologist)
END
FROM CTE1 A
INNER JOIN CTE1 B ON A.[CaseID]=B.[CaseID]
END
但它给我语法错误
[AssignedPathologist] = CASE A.AssignedPathologist = B.AssignedPathologist
这是合乎逻辑的,因为我在这里使用了两次 =
。
有什么方法可以使用 CONCAT 或其他方法优化我的查询吗?
谢谢
我会试试这个:
SELECT [CaseID],
STUFF( (SELECT CONCAT('; ', A.[AssignedPathologist])
FROM CTE1 A
WHERE A.[CaseID] = B.[CaseID]
FOR XML PATH('')
),1, 1, ''
) As [AssignedPathologist]
FROM (SELECT DISTINCT CaseID CTE1 B) B;
对于较新的版本,您可以使用 string_agg()
:
SELECT CASEID, STRING_AGG(AssignedPathologist, '; ') AS AssignedPathologist
FROM CTE1 C1
GROUP BY CASEID;