Как оптимизировать этот SQL-запрос? - PullRequest
0 голосов
/ 26 января 2010

У меня есть 3 таблицы:

  • CRSTasks (ID, parentID)
  • CRSTaskReceivers (ID, tskID, receiveID)
  • UserNames (id, name)

... связь между CRSTasks и CRSTaskReceivers один-ко-многим
между UserNames и CRSTaskReceivers один на один

tasks   
ID   parent  
1     null    
10     1      
50     1

taskReceivers  
id      taskID    receiverID  
1        1          4(john)  
1        10         2(mike)  
1        50         3(brand)  

Мне нужен такой результат:

taskid    Receivers
------------------- 
1           jone,mike,brand   

ТОЛЬКО ДЛЯ РОДИТЕЛЬНЫХ ЗАДАЧ

Ответы [ 2 ]

2 голосов
/ 26 января 2010

SQL Server 2005 +:


SELECT t.id AS taskid,
       STUFF((SELECT ','+ x.name
                FROM (SELECT COALESCE(pu.[ArabicName], aut.Name) AS name
                        FROM CRSTaskReceivers tr 
                        JOIN AD_USER_TBL aut ON aut.id = tr.receiverid
                   LEFT JOIN PORTAL_USERS pu ON pu.id = aut.id
                       WHERE tr.crstaskid = t.id
                         AND tr.receivertype = 1
                      UNION
                      SELECT agt.name
                        FROM CRSTaskReceiver tr
                        JOIN AD_GROUP_TBL sgt ON agt.id = tr.receiverid
                       WHERE tr.receivertype = 3
                         AND tr.crstaskid = t.id) x
         FOR XML PATH('')), 1, 1, '')
  FROM CRSTasks t

Функция не нужна.

1 голос
/ 26 января 2010

Помимо нечетной конкатенации строк, она выглядит так, как будто все можно сделать за один запрос вместо четырех.Прекрасно иметь более одного критерия в соединении.Что-то не так:

FROM   CRSTaskReceiver
   INNER JOIN CRSTask
        ON  CRSTaskReceiver.CRSTaskID = CRSTask.ID
   INNER JOIN CRS_BuiltinGroup
        ON  CRSTaskReceiver.ReceiverID = CRS_BuiltinGroup.ID AND CRSTaskReceiver.ReceiverType = 4
WHERE  CRSTask.ParentTask = @TaskID

Кроме того, приведенная ниже часть функции, кажется, абсолютно ничего не делает.Что это значит?

DECLARE @tmpLength INT
SET @tmpLength = 0
SET @tmpLength = LEN(@tmp)
IF @tmpLength > 0
BEGIN
    SET @tmp = SUBSTRING(@tmp, 0, @tmpLength)
END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...