0

是否可以使用 SQL 语句实现以下逻辑?如果实施,在 30 分钟的时间范围内处理 4000 个订单时是否存在潜在的性能风险。我们有 SQL Server 作为我们的数据库。

我有 2 个表格,如下所示。

订单

Cust_ID Cust_WHID Emp_ID 纬度 经度
C10001 WH142001 ?????? 13.051738 77.629877
C10002 WH142001 ?????? 13.047688 77.629279
C10003 WH142001 ?????? 13.043722 77.623373
C10004 WH142002 ?????? 13.047213 77.628853

User_Validation
User_ID User_WHID Latitude Longitude Current_Capacity
EMP100001 WH100001 13.033304 77.636592 5 EMP100002 WH100001 13.032645 77.629908 3 EMP100003 WH100001 13.046191 77.625797 0 EMP100004 WH100002 13.044981 77.626154 2 EMP100005 WH100002 13.052305 77.631151 4 EMP100006 WH100002 13.051004 77.630786 0

现在我想用以下标准更新 Orders 表中的 Emp_ID 字段。

  1. 从 User_Validation 表中查找每个仓库的员工人数。
  2. 通过将 User_Validation 表中员工的纬度和经度与 Order 表中客户的纬度和经度进行比较,找到离客户最近的员工。
  3. 最近的员工 Current_Capacity 不应超过 6。
  4. 如果它已经是 6 则找到下一个没有最大容量的员工,依此类推,直到找到员工。
  5. 如果所有员工的容量为 6,则将最近的员工 ID 分配给客户

我尝试了以下逻辑,我知道当有多个记录时它不会起作用。我什至尝试了一条记录,但语句中出现错误。

Update Orders Set Emp_ID=User_Validation.User_ID from (Select User_ID from 
User_Validation where Current_Capacity <='6' and (SELECT Top 1 User_ID, (( 6367450 * 
acos(   cos( radians(Orders.Latitude) ) * cos( radians( User_Validation.Latitude ) ) * 
cos(   radians( User_Validation.Longitude ) - radians(Orders.Longitude) ) + sin(   
radians(Orders.Latitude) ) * sin( radians( User_Validation.Latitude ) ) ) )) AS   
distance_Mtrs FROM Orders, User_Validation order by distance_Mtrs)) where   
Orders.Cust_WHID=User_Validation.User_WHID
4

1 回答 1

0

也许以下查询可以指导您

with cte as (
SELECT 
    Cust_ID, Cust_WHID,
    User_ID, User_WHID, Current_Capacity,
    case when Current_Capacity >= 6 then 1 else 0 end as isfull,
    dbo.fnGetDistance(o.Latitude, o.Longitude, e.Latitude, e.Longitude, 'Meters') distance
FROM Orders o, User_Validation e
--  ORDER BY Current_Capacity
), cte2 as (
select *, row_number() over (order by distance, isfull, Current_Capacity) rn
from cte
--  ORDER BY distance, isfull, Current_Capacity
)
select * from cte2
where rn = 1
--ORDER BY distance, isfull, Current_Capacity

我使用了 Jim Jackson 准备的用户函数来计算距离(请参考http://weblogs.asp.net/jimjackson/archive/2009/02/13/calculating-distances-between-latitude-and-longitude-t- sql-haversine.aspx )

于 2013-09-24T06:20:52.143 回答