0

名前、給与、その他の詳細を含む従業員テーブルをオラクルに持っています。

2 番目に高い給与を取得しようとしていますが、取得できません。

これは正常に動作します

with e_salary as (select distinct salary from employee)
select salary from e_salary
order by salary desc

出力が得られます:

450000

61000

60000

50000

40000

30000

20000

6000

しかし、同じクエリを使用して2番目に高い行をフェッチすると、出力が得られません

select salary
  from ( with e_salary as (select distinct salary from employee)
         select salary from e_salary order by salary desc)
 where rownum = 2

しかし、を置き換えるrownum=2rownum<2、最初の2つのレコードが出力されます。なぜ機能しrownum=2ないのか誰か説明してください

4

7 に答える 7

3

これはうまくいきます:

給与を選択します ( 給与を選択し、rownum を rn から選択します (e_salary から給与を選択し、給与の説明で並べ替えます)) ここで rn = 2;

機能しない理由:

ROWNUM を行に割り当てる場合、Oracle は 1 から開始し、行が選択されたときにのみ値を増やします。つまり、WHERE 句のすべての条件が満たされたときです。この条件では ROWNUM が 2 より大きい必要があるため、行は選択されず、ROWNUM は 1 を超えてインクリメントされることはありません。

あなたが今はっきりしていることを願っています。

于 2013-04-12T05:11:46.753 に答える
2

rownum の使用はトリッキーです。最も安全な方法は、表示する結果の数を制限したい場合にのみ使用することです。たとえば、rownum<2 または rownum<=5 です。

rownum=2 が機能しないのはなぜですか?

ここを読む - http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

要約すると、これはオラクルがクエリを実行する方法です

  1. FROM/WHERE 句が最初になります。
  2. ROWNUM は、FROM/WHERE 句からの各出力行に割り当てられ、インクリメントされます。
  3. SELECT が適用されます。
  4. GROUP BY が適用されます。
  5. HAVINGが適用されます。
  6. ORDER BY が適用されます。

rownum<=2 句は次のように変換されます

ROWNUM = 1
for x in 
( select * from emp )
loop
    exit when NOT(ROWNUM <= 2)
    OUTPUT record to temp
    ROWNUM = ROWNUM+1
end loop
SORT TEMP

exit when NOT(ROWNUM <= 2) with rownnum=2 を変更すると、最初の実行自体で失敗することがわかります

したがって、rownum を使用できない場合は、何を使用できますか。row_number() http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htmを使用してみてください

それは次のように機能します

SELECT last_name FROM 
   (SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
   WHERE R BETWEEN 51 and 100;
于 2013-04-12T05:29:07.983 に答える
0

rownumコマンドを使用しない場合、次のクエリを使用して 2 番目に高い給与を取得できます。

select MAX(Salary) from Employee 
WHERE Salary NOT IN 
(select MAX(Salary) from Employee )

また、

select MAX(Salary) from Employee 
WHERE Salary <> 
(select MAX(Salary) from Employee )

n 番目に高いクエリ:

SELECT * FROM Employee Emp1 
WHERE (N-1) = 
(SELECT COUNT(DISTINCT(Emp2.Salary))FROM Employee Emp2 
WHERE Emp2.Salary > Emp1.Salary)
于 2013-04-12T05:37:52.573 に答える