2

テーブルがあります。名前と給与の 2 つのフィールドが含まれています。以下のスクリプトを使用して、3 番目の最高給与を見つけました。

SELECT DISTINCT sal 
FROM downtodate1.emp e1  
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);

それがどのように機能するのか、なぜ 3 がここで使用されているのか知りたいのですが?

4

7 に答える 7

4
select distinct sal 
from downtodate1.emp AS e1  
where 3 = (
    select count(distinct sal) 
    from downtodate1.emp e2 
    where e1.sal <= e2.sal
);

次のようなテーブルがあるとします。

sal
---
3
3
2
1
1
0

このパーツで

select distinct sal 
from downtodate1.emp AS e1 

あなたは結果を得るでしょう

sal
---
3
2
1
0

それは4つの異なる給与になります。

これでサブクエリ

    select count(distinct sal) 
    from downtodate1.emp e2 
    where e1.sal <= e2.sal

メインクエリのすべての行に対して実行されます。メインクエリの行よりも小さいか等しい個別の値の数を計算します。したがって、この結果は実際には次のようになります (ただし、表示されません)。

sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3     1
3     1
2     2
1     3
1     3
0     4

メインクエリとは異なり、次の結果が得られます。

sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3     1
2     2
1     3
0     4

WHERE句を使用すると、次の3 = (/*subquery*/)ようになります

sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
1     3

この行。したがって、結果は1です。

それが今明らかになることを願っています。

于 2013-03-18T10:43:57.210 に答える
1

これがより速い方法です...

 SELECT salary
   FROM
      (
        SELECT salary
             , @prev := @curr
             , @curr := salary
             , @rank := IF(@prev = @curr, @rank, @rank+1) rank
          FROM employee
         CROSS
          JOIN 
             ( SELECT @curr := null, @prev := null, @rank := 0) sel1
         ORDER 
            BY salary DESC
      ) x
  WHERE rank = 3;
于 2013-03-18T10:31:34.083 に答える
0

この3つはあなたが書いたものと同じです

  where  
(select count(distinct sal) from downtodate1.emp e2 where e1.sal <= e2.sal) = 3 ;

ここで、a = 3

またはここで、3=個別のsalの数

于 2013-03-18T10:45:11.653 に答える
0

代わりに、これを使用してN番目の最大給与を見つけることができます

SELECT sal FROM emp
ORDER BY sal DESC
LIMIT N,1

NはN番目の数です。

于 2013-03-18T10:17:54.683 に答える
0

おそらく、クエリを再フォーマットすると、次のことが明確になります。

select distinct sal 
from downtodate1.emp AS e1  
where 3 = (
    select count(distinct sal) 
    from downtodate1.emp e2 
    where e1.sal <= e2.sal
);

サブクエリの結果は、必要な行の先行する行の数として3と比較されています。これは(潜在的に)O(N ^ 2)計算ですが、この場合はそれで十分かもしれません。

于 2013-03-18T10:19:10.303 に答える