Sql server 返回用户无法支持的客户的存储过程

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

我创建了一个存储过程,根据客户请求的数量和类型以及用户的技能将客户分配给用户。下面是存储过程部分的摘录-status=0表示未分配

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)