このSQLクエリがどのように評価されるか教えてもらえますか:
SELECT e.sal
FROM employees e
WHERE 1 >= (
SELECT count(*)
FROM employess s
WHERE s.sal>e.sal
)
このクエリが 1 番目と 2 番目に高い給与を返すことはわかっています。しかし、このクエリの動作を理解したいです。1 番目と 2 番目に高い給与を返す方法を知りたいです。詳しく説明してください。
このSQLクエリがどのように評価されるか教えてもらえますか:
SELECT e.sal
FROM employees e
WHERE 1 >= (
SELECT count(*)
FROM employess s
WHERE s.sal>e.sal
)
このクエリが 1 番目と 2 番目に高い給与を返すことはわかっています。しかし、このクエリの動作を理解したいです。1 番目と 2 番目に高い給与を返す方法を知りたいです。詳しく説明してください。
サブセレクト
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)
トップレベルで見ている現在の従業員よりも給与が高い従業員の数を返しますselect
。
したがって、クエリは基本的に、他の従業員が 1 人以下の従業員よりも多く稼いでいるようなすべての従業員を私に与えると言います
ひどく非効率的ですが、かなり簡単です。簡単な方法は次のとおりです。
select top 2 * from employees order by sal desc
編集:これは、給与が最も高い上位2人の従業員を返します。ゴードンが指摘したように、これは上位2つの異なる給与値と同じではありません。人々はまったく同じ給与を持っている可能性があるためです。それが懸念される場合は、最初に次のように重複排除する必要があります。
select top 2 sal from employees group by sal order by sal desc
あなたの1番目と2番目に高い給料を得るために、私はを使用しますROW_NUMBER()
。これにより、給与のランキングがわかりやすくなります。または、同点を考慮する必要がある場合は、の使用を検討してRANK()
ください。
このようなものが機能するはずです:
SELECT sal, Row
FROM (
SELECT sal, ROW_NUMBER() OVER(ORDER BY sal DESC) AS Row
FROM employees e ) t
WHERE Row IN (1,2);
そして、これがSQLFiddleです。
幸運を。
そのクエリはすべてを返す必要があります。
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)
e.salは決して>e.salになることはないので(1は決して> 1になることはできません)、したがって、count(*)は常に0になります。そしてSELECT e.sal FROM employees e WHERE 1 >= (0)
常にすべてになります
上位2つの給与を返したい場合は、次のことを試してみてください。
SELECT TOP 2 * FROM employess AS e ORDER BY e.sal DESC