宿題を手伝ってくれることを願っています:)
上位 N 位の高給の従業員を出力するクエリを作成する必要があります。
私のバージョンは完全に正常に動作します。
たとえば、トップ 3:
SELECT name, salary
FROM staff
WHERE salary IN ( SELECT *
FROM ( SELECT salary
FROM staff
ORDER BY salary DESC )
WHERE ROWNUM <= 3 )
ORDER BY salary DESC
;
これにより、上位 3 位に含まれる同じ給与の従業員も出力されることに注意してください。
1: マイク、4080
2: スティーブ、2800
2: スーザン、2800
2: ジャック、2800
3: クロエ、1400
しかし今、私たちの先生は私たちが を使用することを許可していませんROWNUM
。
私は広範囲に検索しましたが、使用できるものは何も見つかりませんでした。
Justin Caves のヒントのおかげで、私の 2 番目の解決策です。
最初に私はこれを試しました:
SELECT name, salary, ( rank() OVER ( ORDER BY salary DESC ) ) as myorder
FROM staff
WHERE myorder <= 3
;
エラーメッセージは次のとおりです:「myorder: 無効な識別子」
DCookie のおかげで、次のことが明確になりました。
「[...] where句が評価された後に分析が適用されるため、myorderが無効な識別子であるというエラーが発生します。」
SELECT をラップすると、これが解決されます。
SELECT *
FROM ( SELECT name, salary, rank() OVER ( ORDER BY salary DESC ) as myorder FROM staff )
WHERE myorder <= 3
;
私の先生は再びストライキをし、そのような風変わりな分析機能を許可しません。
@Justin Caves の3 番目のソリューション。
「分析関数も許可されていない場合、私が想像できるもう1つのオプション-実際には決して、実際に書くことのないものは、次のようなものになるでしょう」
SELECT name, salary
FROM staff s1
WHERE (SELECT COUNT(*)
FROM staff s2
WHERE s1.salary < s2.salary) <= 3