表员工:
Empid STW --StartWorkTime
------------------------------
1 02:00:00.000
2 03:00:00.000
3 05:30:00.000
表顺序:
Orderid PlaceTime
-------------------------------
1 02:22:22.333
2 02:33:33:555
3 03:44:44:111
4 05:45:45:545
请求是:将员工按其时间关系放置的订单连接起来,例如:
Empid Orderid
--------------------
1 1
1 2
2 3
3 4
假设最后一名员工下班时间=当前工作时间。
目前我的解决方案是:
SELECT e.empid, o.orderid
FROM order o
CROSS APPLY
(SELECT TOP(1) e.empid FROM order e
WHERE e.STW < o.placetime
ORDER BY STW DESC) e
当表employee
很小(order
1 mil行,employee
50行,大约30秒)时,解决方案正常工作,但随着employee
展开,性能会迅速下降(当它行10000次时,需要一个多小时)。是否有任何解决方案来优化这种情况?
答案 0 :(得分:0)
我首先推荐索引。首先,我会修复查询,以便子查询使用employee表(我假设这是问题中的拼写错误):
SELECT e.empid, o.orderid
FROM order o CROSS APPLY
(SELECT TOP(1) e.empid
FROM employee e
WHERE e.STW < o.placetime
ORDER BY STW DESC
) e;
您需要employee(STW, empid)
上的索引。看看这是否有助于查询。