我有3张桌子:
... 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
仅限于父母的任务,这将会使接收者感到意外
答案 0 :(得分:2)
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 :(得分:1)
除了奇数字符串连接之外,确实看起来所有可以在一个查询而不是四个查询中完成。在连接中有多个标准是完全没问题的。一些事情:
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