【问题标题】:Optimize query using Concat method使用 Concat 方法优化查询
【发布时间】: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


【解决方案1】:

我会试试这个:

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;

【讨论】:

  • 我使用这个有相同的执行时间。无论如何,为你的努力 +1。
  • 标记您正在使用的数据库版本。
  • SQL Server 2017
  • 是的,您的第二个解决方案似乎效果很好。谢谢!
  • STRING_AGG 是我正在寻找的最快替代品吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2018-03-11
  • 2018-08-24
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多