3

上位3つの給与を受け取っている従業員を表示するクエリを作成したい

  SELECT *
    FROM (SELECT salary, first_name
            FROM employees
        ORDER BY salary desc)
   WHERE rownum <= 3;

しかし、ネストされたクエリに対してこのrownumがどのように計算されるのかわかりません。問題がある場合は、理解してください。

SELECT *
  FROM (SELECT salary, first_name 
          FROM employees
      ORDER BY salary )
 WHERE rownum >= 3;

私はこのリンクを通過しましたOracle/SQL:クエリ "SELECT * FROM records WHERE rownum> = 5 AND rownum <= 10"-ゼロ行を返しますが、これもリンクを指していますが、答えは得られません

4

8 に答える 8

6

a_horse_with_no_name の答えは良いものですが、最初の
クエリが機能し、2番目のクエリが機能しない理由を理解するためだけに:

サブクエリを使用する場合、Oracle は魔法のようにサブクエリの rownum を使用しません。順序付けされたデータを取得するだけなので、それに応じて rownum が与えられ、基準に一致する最初の行は引き続き rownum 1 などを取得します。これが、2 番目のクエリがまだ行を返さない理由です。

開始行を制限したい場合は、サブクエリの行番号を保持する必要があります。つまり、次のようになります。

SELECT *
FROM (SELECT * , rownum rn
  FROM (SELECT salary, first_name
          FROM employees
      ORDER BY salary ) )sq
WHERE sq.rn >= 3;

しかし、 a_horse_with_no_name が言ったように、より良いオプションがあります...

編集:物事をより明確にするために、次のクエリを見てください:

with t as (
select 'a' aa, 4 sal from dual
union all
select 'b' aa, 1 sal from dual
union all
select 'c' aa, 5 sal from dual
union all
select 'd' aa, 3 sal from dual
union all
select 'e' aa, 2 sal from dual
order by aa
)
select sub.*, rownum main_rn 
  from (select t.*, rownum sub_rn from t order by sal) sub 
 where rownum < 4

サブrownumとメインrownumの違いに注意してください。どちらが基準に使用されているかを確認してください

于 2012-04-15T08:16:25.000 に答える
4

クエリの「rownum」は、order by が結果に適用される前に割り当てられます。したがって、rownumw 42 が最初の行になる可能性があります。

一般的に言えば、内部クエリの rownum を使用して、全体的な出力を制限する必要があります。これは、マニュアルで非常によく説明されています。

http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns009.htm#i1006297

代わりに row_number() を使用することをお勧めします。これは、並べ替えをより適切に制御でき、さらに、ほとんどの最新の DBMS で動作する標準機能であるためです。

SELECT *
FROM (
  SELECT salary, 
         first_name, 
         row_number() over (order by salary) as rn
  FROM employees
)
WHERE rn <= 3
ORDER BY salary;

この場合の派生テーブルは、生成されたrn列に条件を適用できるようにするためにのみ必要であることを理解する必要があります。row_number() の値はパーツ内の指定された順序にのみ依存するため、「行番号の問題」を回避するためのものではありませんover(...)(クエリ自体に適用される順序とは無関係です)。

これは、給与が同じで上位 3 位以内に入る従業員を返さないことに注意してください。その場合は、使用するdense_rank()方がおそらく適切です。

于 2012-04-15T07:47:35.490 に答える
0

すべてのフィールドの詳細を返す oracle で上位 3 人の従業員を見つける最も簡単な方法:

SELECT *
FROM (
    SELECT * FROM emp  
      ORDER BY sal DESC)
WHERE rownum <= 3 ;
于 2013-09-20T02:11:33.363 に答える
0

上位3人の給与を選択したい場合..おそらく分析の使用を検討する必要があります..もっと似たようなもの

SELECT *
FROM (
    SELECT salary, first_name, dense_rank() over(order by salary desc) sal_rank
    FROM employees 
)
WHERE  sal_rank <= 3

つまり、3 番目に高い (ランク付けされた) 給与額 (またはそれ以上) を持つすべての人

単純なrownumを使用するよりもこれが有利な点は、同じ給与を持つ複数の人がいる場合、全員が返されることです。

于 2013-05-02T05:38:09.693 に答える
0

5番目に高い給与を印刷する最も簡単な方法.

SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 5 

同様に、3 番目または 4 番目に高い給与を出力したい場合は、最後の値を変更します (つまり、5 の代わりに 3 または 4 を使用すると、3 番目または 4 番目に高い給与が得られます)。

SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 4

SELECT MIN(SALARY) FROM (SELECT SALARY FROM EMPLOYEES ORDER BY DESC) WHERE ROWNUM BETWEEN 1 AND 3
于 2013-08-26T19:17:05.337 に答える