2

このSQLクエリがどのように評価されるか教えてもらえますか:

SELECT e.sal 
FROM employees e 
WHERE 1 >= (
    SELECT count(*) 
    FROM employess s 
    WHERE s.sal>e.sal
)

このクエリが 1 番目と 2 番目に高い給与を返すことはわかっています。しかし、このクエリの動作を理解したいです。1 番目と 2 番目に高い給与を返す方法を知りたいです。詳しく説明してください。

4

3 に答える 3

4

サブセレクト

 (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
于 2013-01-29T17:55:37.443 に答える
1

あなたの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です。

幸運を。

于 2013-01-29T17:51:31.050 に答える
0

編集:私はeとsを逃しました。だから私の答えは間違っています。

そのクエリはすべてを返す必要があります。

(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
于 2013-01-29T17:49:23.690 に答える