#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伪列的变通方法。

SQL 调优,长时间运行的查询 + rownum

Oracle/SQL:为啥查询“SELECT * FROM records WHERE rownum >= 5 AND rownum <= 10” - 返回零行

Java SQL [ 限制 | rownum ...] 统一化 API

[9]SQL SELECT TOP, LIMIT, ROWNUM