#SQL #QUERY #ROWNUM #ORACLE - PullRequest
       16

#SQL #QUERY #ROWNUM #ORACLE

0 голосов
/ 09 января 2019

Я бы хотел выбрать 3-ю зарплату сотрудникам TABLE. Я написал QUERY, как вы можете видеть ниже, но, к сожалению, это дает мне 0 записей. Может ли кто-нибудь помочь мне в этой теме? Я использую СУБД Oracle :) и вот пример моей базы данных: SQL Fiddle

SELECT *
FROM 
  (SELECT ROWNUM, salary 
  FROM 
    (SELECT DISTINCT salary 
    FROM employees
    ORDER BY salary desc)
  )
WHERE ROWNUM = 3;

Ответы [ 2 ]

0 голосов
/ 09 января 2019

В стандартном SQL, большинстве баз данных и Oracle 12C + вместо этого можно использовать:

SELECT DISTINCT salary 
FROM employees
ORDER BY salary desc
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;
0 голосов
/ 09 января 2019

Похоже, что Oracle (ROWNUM и без псевдонима для производной таблицы). ROWNUM рассчитывается для результирующих строк, поэтому вы никогда не сможете отфильтровать любое ROWNUM больше 1.

Вам нужен стандартный SQL ROW_NUMBER:

SELECT *
FROM
 ( SELECT salary
      ,row_number() over (ORDER BY salary desc) as rn 
   FROM employees
   GROUP BY salary
 ) dt
WHERE rn = 3;

GROUP BY эквивалентна DISTINCT, но обрабатывается до ROW_NUMBER, а DISTINCT обрабатывается после .

Edit:

Если вы хотите использовать ROWNUM, вы должны использовать псевдоним:

SELECT *
FROM 
  (SELECT ROWNUM as rn, salary 
  FROM 
    (SELECT DISTINCT salary 
    FROM employees
    ORDER BY salary desc)
  )
WHERE rn = 3;
...