假设我有两张桌子。
表1:员工名单
| ID | Name |
| ---| ------------|
| 1 | Joe |
| 2 | Jim |
| 3 | Jane |
| 4 | Jill |
| 5 | Dilbert |
表2:每月薪水
| Check # | Employee ID | Amount paid |
|---------|-------------|-------------|
| 11235 | 3 | 2000 |
| 51239 | 2 | 3000 |
| 72244 | 5 | 6500 |
| 61633 | 2 | 2300 |
| 14234 | 1 | 2900 |
| 91335 | 1 | 4500 |
| 13736 | 4 | 3000 |
| 41234 | 5 | 5000 |
| 71232 | 4 | 10000 |
| 88234 | 2 | 6000 |
| 23039 | 3 | 1200 |
| 42534 | 2 | 9000 |
| 74834 | 3 | 1230 |
| 38034 | 5 | 9900 |
| 91334 | 2 | 1280 |
| 24134 | 1 | 2000 |
所以基本上我们有5名员工和一张表,记录我们每月支付的费用。
我需要提出一个查询,以便返回所有按照最佳PAYCHECK EVER订购的员工。
就像......吉尔曾经有过10000薪水,这使得她在结果集上排名第一。迪尔伯特应该是#2,因为他曾经拿到9900薪水。等
对于包含数百万条目的表格,它应该足够快
提前致谢!
答案 0 :(得分:1)
select
p.ID,
e.NAME
from
Paychecks p
inner join Employee e on p.EmployeeID = e.ID
group by
p.ID
order by
max(p.AmountPaid) desc
一种不同的写作方式,看起来更符合逻辑,但可能更慢(你必须测试)是:
select
e.ID,
e.NAME
from
Employee e
inner join Paychecks p on p.EmployeeID = e.ID
group by
e.ID
order by
max(p.AmountPaid) desc
有数千万行,每个查询有时会变得缓慢,但是使用适当的索引,这个速度和它一样快。我认为你基本上需要一个Paychecks.EmployeeID和Paychecks.AmountPaid组合的索引。 Employee.ID上的索引可能有所帮助。
如果联接最终会杀死你,你可以执行两个查询。第一个只使用paychecks按EmployeeID对它们进行分组,并按max(PaycheckAmount)对它们进行排序,第二个可以用来获取每个ID的名称。有时加入的成本比你想要的要多,当你为500名员工拿到1000万美元的薪水时,分两步完成它可能会更快,尽管这意味着他们已经在公司工作了1600年左右。 ; - )
答案 1 :(得分:0)
正如Golez所说,有了这么多数据,查询可能会很慢。
也许你应该跟踪最高薪水,而不是每次都询问db?
您可以通过程序或使用触发器执行此操作。取决于你。
在这种情况下,您只需要执行一次查询,用初始数据填充表格,然后它将自动更新