個別の employee_ID と Salary を持つ 100 個のテーブルを含むデータベースがあります。データベースの合計行数は 1 億 (100 テーブルのすべての行の合計) です。テーブルの行数が等しくありません。100 個のテーブルが地域に応じているとしましょう。すべてのテーブルから給与の上位 10% を返したいと考えています。どうすればそれができますか?
1 に答える
4
まず、一般に、同じ形式のテーブルが複数あるということは、データベース設計が不適切であることを示しています。すべての行を含む 1 つのテーブルを用意することをお勧めします。
次に、100 のテーブルが、MySQL クエリが処理できる限界に達し始めています。以下は、すべてのデータを並べ替える必要があるため、優れたパフォーマンスは得られませんが、機能するはずです。
select es.*
from (select es.*, (@rn := @rn + 1) as rn
from ((select employee_id, salary from table001) union all
. . .
(select employee_id, salary, from table100)
) es cross join
(select @rn := 0) vars
order by salary desc
) t
where rn <= @rn * 0.1;
これは、サブクエリが行を列挙した後、変数@rn
に行の総数が含まれるために機能します。これは最終フィルターに使用できます。
于 2014-07-30T11:29:54.060 に答える