Оптимизировать запрос с помощью метода Concat - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть запрос, который использует соединение, затем группирование по 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

, которая является logi c, потому что Я использовал здесь дважды =.

Есть ли способ оптимизировать мой запрос, используя CONCAT или другие методы?

Спасибо

1 Ответ

1 голос
/ 14 апреля 2020

Я бы попробовал с этим:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...