Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化此SQL查询?_Sql_Sql Server_Aggregate - Fatal编程技术网

如何优化此SQL查询?

如何优化此SQL查询?,sql,sql-server,aggregate,Sql,Sql Server,Aggregate,我有三张桌子: CRSTasks(ID,parentID) CRS任务接收人(ID、tskID、接收人ID) 用户名(id、名称) …CRSTasks和CRSTaskReceivers一对多之间的关系 在用户名和密码之间一对一 tasks ID parent 1 null 10 1 50 1 taskReceivers id taskID receiverID 1 1 4(jo

我有三张桌子:

  • CRSTasks(ID,parentID)
  • CRS任务接收人(ID、tskID、接收人ID)
  • 用户名(id、名称)
…CRSTasks和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   

仅对于父任务,它将连接接收器

,除了奇数字符串连接之外,它看起来像是一个查询而不是四个查询中可以完成的所有操作。在一个联接中有多个条件是非常好的。一些事情:

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 
SQL Server 2005+:

不需要该函数。

是否需要包含此函数返回的所有答案的单个字符串?你用它干什么?首先,欢迎来到SO。你的问题很不清楚。如果你删去你理解的部分,只留下问题的核心,你就能得到更好的答案。这样,知道您问题答案的人就可以很快知道您的问题。@ramadan2050:您使用的是什么版本的SQL Server?谢谢大家,我在问题中做了更改,希望它能帮上忙我觉得你很近:)我试过了,但有点不对劲,它只检索了一个名字,例如1 john 2 sam 3 mike,它应该检索1 jone,adam,pla…好的,我还有一件事可能会有帮助,任务表有一个自连接关系,parentTask Id:1 parent:null receiverID:10(john)Id:2父:1接收Id:15(adam)Id:3父:1接收Id:7(mag)因此结果将仅用于父任务,因此将[1-John,adam,mag]更新,因为我错过了正在添加的组名。嗨,天哪,谢谢你的努力,但执行查询也需要很多时间
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