【发布时间】:2020-04-14 13:11:28
【问题描述】:
我有一个使用 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 或其他方法优化我的查询吗?
谢谢
【问题讨论】:
-
这显然不是整个查询。您在 SQL 中引用了
CTE1和CTE2,但不包括这些表达式。DISTINCT也可能非常昂贵。向我们提供完整的查询、相关对象的 DDL(包括它们的索引)和查询计划(搜索粘贴计划)将极大地帮助我们在这里为您提供帮助。 -
还有一个没有聚合的
GROUP BY和一个DISTINCT没有什么意义。如果您的GROUP BY是正确的,那么您已经有了不同的结果,因此让实例(再次)扫描整个数据集以查找重复项只会减慢查询速度。 -
@Larnu,我没有 CTE2。另外,我忘了说创建 CTE1 和 CTE2 优化得很好。
-
该查询本身并不需要很长时间。 CTE 很容易产生影响;特别是因为它运行了两次。发布完整的查询,连同执行计划和 DDL...帮助我们帮助您。
-
请注意您的
CASE表达式 (CASE A.AssignedPathologist = B.AssignedPathologist)。CASE的语法是CASE {expression} WHEN {expression} THEN ...或CASE WHEN {Boolean Expression} THEN...。您有CASE {Boolean Expression},它不是有效的 T-SQL。有关如何编写CASE表达式的示例,请参阅 CASE (Transact-SQL。
标签: sql sql-server tsql sql-server-2017