Sql server 返回用户无法支持的客户的存储过程
我创建了一个存储过程,根据客户请求的数量和类型以及用户的技能将客户分配给用户。下面是存储过程部分的摘录-status=0表示未分配Sql server 返回用户无法支持的客户的存储过程,sql-server,stored-procedures,having,Sql Server,Stored Procedures,Having,我创建了一个存储过程,根据客户请求的数量和类型以及用户的技能将客户分配给用户。下面是存储过程部分的摘录-status=0表示未分配 SELECT TOP 1 gdd.customerReference FROM customerRequests gdd LEFT OUTER JOIN userSkills us ON us.requestTypeId = gdd.requestTypeId AND us.userId = @pi
SELECT TOP 1
gdd.customerReference
FROM
customerRequests gdd
LEFT OUTER JOIN
userSkills us ON us.requestTypeId = gdd.requestTypeId
AND us.userId = @pinUserId
LEFT OUTER JOIN
requestAttributes dt ON dt.requestTypeId = gdd.requestTypeId
WHERE
gdd.status = 0
GROUP BY
gdd.requestDateTime, gdd.customerReference, gdd.requestId, gdd.requestTypeId
HAVING
COUNT(*) = COUNT(us.userId)
示例数据:
客户要求
requestId requestTypeId policyNumber customerReference requestDateTime userId status
1 3 Policy A Customer 1 30/11/2015 10:13 0
2 4 Policy A Customer 1 30/11/2015 10:33 0
3 11 Policy B Customer 2 26/11/2015 15:26 0
4 17 Policy B Customer 2 26/11/2015 15:27 0
5 1 Policy B Customer 2 27/11/2015 10:05 0
用户技能:
skillId userId requestTypeId
1 user1 3
2 user1 17
3 user1 11
4 user1 1
5 user2 1
6 user2 3
7 user4 4
请求属性:
requestTypeId description priority tolerance
1 Type A 200 90
2 Type B 999 999999
3 Type C 100 7
4 Type D 100 5
5 Type E 50 5
6 Type F 100 999999
7 Type G 999 999999
8 Type H 999 999999
9 Type I 999 999999
10 Type J 999 999999
11 Type K 100 999999
12 Type L 999 999999
13 Type M 999 999999
14 Type N 999 999999
15 Type O 100 5
16 Type P 100 10
17 Type Q 100 10
通过使用select中的TOP 1,当我用user1替换@pinUserId
时,查询将正确返回Customer 2。问题是,如果我从查询中去掉TOP 1,我也会在结果集中看到Customer 1,即使user1无法处理Customer 1的两个请求。如果客户1的请求在客户2之前到达,则用户1将被错误地分配给客户1
有人能为这个问题提出解决方案吗?我很感兴趣的是,在查询中使用
TOP 1
,而不使用ORDER BY
。因为SQL保证不排序,所以您是说给我任何随机行。既然你没有说,你能解释一下选择这个“正确”结果的业务规则吗?你为什么还要加入RequestAttributes表?它在查询结果中不起任何作用。抱歉,在语句的off处错过了order by DATEDIFF(day,gdd.requestDateTime,GETDATE())-dt.tolerance DESC,dt.priority,MIN(gdd.requestDateTime)