如何优化此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、名称)
在用户名和密码之间一对一
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