1

Google検索で次の解決策を見つけましたが、理解できません。このクエリがどのように処理されたかを誰でも説明できますか?

SELECT *
FROM   employee_test e1
WHERE  3 = (SELECT DISTINCT count(*)
            FROM   employee_test e2
            WHERE  e2.emp_sal > e1.emp_sal) 
4

1 に答える 1

2

給与が 4 番目に高い従業員を返すのは、非常に非効率的な相関クエリです。

SELECT *
FROM   employee_test e1
WHERE  3 = (SELECT DISTINCT count(*)
            FROM   employee_test e2
            WHERE  e2.emp_sal > e1.emp_sal);

給与 (emp_sal) が一意であると仮定すると、サブクエリは、'e1' の従業員よりも給与が高い従業員の数をカウントします。カウントが 3 の場合、これは 4 番目に給与が高い従業員です。

4 位が同点の場合 (例: 6 位または 10 位まで)、すべての同点が結果に表示されます。4 番目と 1 つ上位のスロット (2 番目から 4 番目、または 3 番目と 4 番目など) を含む同点の場合、emp_sal の値がなく、emp_sal 値が高い正確に 3 つのレコードがあるため、結果はありません。

より良いフォームは

select top(1) with ties * 
from (
    select *, rn=rank() over (order by emp_sal desc)
    from employee_test
    ) x
where rn <= 4
order by rn desc;

これは、完全に 4 番目に高い給与を示します (また、もしあれば同数)、または 3 番目から 6 番目まで (スポット #4 をカバー) が同数の場合は、3 番目から 6 番目までを示します。

于 2013-04-04T10:17:17.853 に答える