0

假设我有两张桌子。

表 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 名员工和一张记录我们每个月付给他们多少钱的表格。

我需要进行一个查询,以返回由他们的 BEST PAYCHECK EVER 订购的所有员工。

就像...吉尔曾经有 10000 的薪水,这使她在结果集中排名第一。Dilbert 应该是 #2,因为他曾经拿到 9900 的薪水。等等。

对于具有数百万个条目的表,它应该足够快

提前致谢!

4

2 回答 2

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 上的索引可能会有所帮助。

如果连接最终杀死了你,你可以执行两个查询。第一个仅使用薪水按 EmployeeID 对它们进行分组并按 max(PaycheckAmount) 对其进行排序,第二个可用于获取每个 ID 的名称。有时加入成本比你想要的更高,当你为 500 名员工拿到 1000 万的薪水时,分两步完成可能会更快,尽管这意味着他们平均在公司工作了大约 1600 年. ;-)

于 2013-06-19T14:07:19.250 回答
0

正如 Golez 所说,有了这么多的数据,查询可能会很慢。

也许您应该跟踪最高薪水,而不是每次都询问 db?

您可以通过您的程序或使用触发器来执行此操作。取决于你。

在这种情况下,您只需执行一次查询,用初始数据填充表,然后它将自动更新

于 2013-06-19T14:15:50.200 回答