#SQL #QUERY #ROWNUM #ORACLE
Posted
技术标签:
【中文标题】#SQL #QUERY #ROWNUM #ORACLE【英文标题】: 【发布时间】:2019-01-09 10:23:20 【问题描述】:我想从 TABLE 员工中选择第三个薪水。我已经写了 QUERY,如下所示,但不幸的是它给了我 0 条记录。有人可以在这个话题上帮助我吗?我正在使用 Oracle DBMS :),这是我的数据库的一个示例:SQL Fiddle
SELECT *
FROM
(SELECT ROWNUM, salary
FROM
(SELECT DISTINCT salary
FROM employees
ORDER BY salary desc)
)
WHERE ROWNUM = 3;
【问题讨论】:
您介意提供一些示例输入和预期输出为formatted text
吗?
因为我们不知道你的表结构是什么,你的源数据包含什么或者你期望得到什么结果,所以很难告诉你你的查询是否正确,或者要改变什么.我们无法神奇地查看您的数据库...您需要向我们提供有关您的方案的完整信息 - 谢谢。
您使用的是哪个 RDBMS?像这样陈述问题过于宽泛,因为每个 RDBMS 对行的计数不同。如果没有排序的概念,SQL Server 甚至没有确定性的行数。
另外请标记您正在使用的 DBMS - 例如。 Oracle、mysql、SQL Server 等。查询所需的语法或您可用的函数可能会有所不同。
从你的内部查询中选择 ROWNUM
【参考方案1】:
似乎是 Oracle(派生表的 ROWNUM 和没有别名)。 ROWNUM 是为 resulting 行计算的,因此您永远无法过滤任何大于 1 的 ROWNUM。
您需要一个标准 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 在之后处理。
编辑:
如果你想使用 ROWNUM 你必须给它起别名:
SELECT *
FROM
(SELECT ROWNUM as rn, salary
FROM
(SELECT DISTINCT salary
FROM employees
ORDER BY salary desc)
)
WHERE rn = 3;
【讨论】:
感谢您的帮助,。现在一切都清楚了。 :)【参考方案2】:在标准 SQL、大多数数据库和 Oracle 12C+ 中,您可以改为使用:
SELECT DISTINCT salary
FROM employees
ORDER BY salary desc
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;
【讨论】:
以上是关于#SQL #QUERY #ROWNUM #ORACLE的主要内容,如果未能解决你的问题,请参考以下文章
The query can‘t be routed to all backend servers because it includes SELECT and SQL variable modific
sql 使用ROWNUM限制数据,使用内联视图的ROWNUM伪列的变通方法。
Oracle/SQL:为啥查询“SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10” - 返回零行