Google検索で次の解決策を見つけましたが、理解できません。このクエリがどのように処理されたかを誰でも説明できますか?
SELECT *
FROM employee_test e1
WHERE 3 = (SELECT DISTINCT count(*)
FROM employee_test e2
WHERE e2.emp_sal > e1.emp_sal)
Google検索で次の解決策を見つけましたが、理解できません。このクエリがどのように処理されたかを誰でも説明できますか?
SELECT *
FROM employee_test e1
WHERE 3 = (SELECT DISTINCT count(*)
FROM employee_test e2
WHERE e2.emp_sal > e1.emp_sal)
給与が 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 番目までを示します。