简体   繁体   English

#SQL#查询#行#ORACLE

[英]#SQL #QUERY #ROWNUM #ORACLE

I would like to select 3rd salary from TABLE employees. 我想从TABLE员工中选择3rd薪水。 I have written QUERY as you may see below but unfortunately it gives me 0 record. 正如您在下面看到的那样,我已经写了QUERY,但是很遗憾,它给了我0条记录。 Can somebody help me on this topic ? 有人可以帮我这个话题吗? I am using Oracle DBMS :) and here is an example of my database: SQL Fiddle 我正在使用Oracle DBMS :),这是我的数据库示例: SQL Fiddle

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

Seems to be Oracle (ROWNUM and no alias for the Derived Table). 似乎是Oracle(ROWNUM,并且派生表没有别名)。 ROWNUM is calculated for the resulting rows, thus you can never filter for any ROWNUM greater than 1. ROWNUM是针对结果行计算得出的 ,因此,您绝不能为任何大于1的ROWNUM进行过滤。

You need a Standard SQL ROW_NUMBER: 您需要标准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;

The GROUP BY is equivalent to DISTINCT, but processed before the ROW_NUMBER while DISTINCT is processed after . GROUP BY等效于DISTINCT,但 ROW_NUMBER 之前处理而DISTINCT 在之后处理。

Edit: 编辑:

If you want to use ROWNUM you must alias it: 如果要使用ROWNUM,则必须使用别名:

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

In standard SQL, most databases, and Oracle 12C+, you can instead use: 在标准SQL,大多数数据库和Oracle 12C +中,您可以改为使用:

SELECT DISTINCT salary 
FROM employees
ORDER BY salary desc
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM