0

2 つのテーブルがあるとします。

表 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 の給料をもらっていたので、結果セットで 1 位になりました。ディルバートはかつて 9900 の給料をもらっていたので、2 位になるはずです。等。

数千万のエントリを持つテーブルで十分に高速である必要があります

前もって感謝します!

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 を組み合わせた 1 つのインデックスが必要だと思います。また、Employee.ID のインデックスが役立つ場合があります。

結合が最終的にあなたを殺している場合は、2 つのクエリを実行できます。1 つ目は給与のみを使用して EmployeeID でグループ化し、max(PaycheckAmount) で並べ替えます。2 つ目は各 ID の名前を取得するために使用できます。結合すると、必要以上にパフォーマンスが低下することがあります。500 人の従業員に対して 1,000 万の給与を受け取った場合、平均して約 1600 年間その会社で働いていることを意味しますが、2 つのステップで実行する方が速い場合があります。 . ;-)

于 2013-06-19T14:07:19.250 に答える
0

Golez が言うように、このような量のデータでは、クエリが遅くなる可能性があります。

たぶん、毎回dbに尋ねるのではなく、最大の給料を追跡する必要がありますか?

プログラムから、またはトリガーを使用して実行できます。君に任せます。

この場合、クエリを 1 回だけ実行してテーブルに初期データを入力するだけで、自動的に更新されます。

于 2013-06-19T14:15:50.200 に答える