#SQL #QUERY #ROWNUM #ORACLE
#SQL #QUERY #ROWNUM #ORACLE
我想select TABLE 名员工的第3 份薪水。正如您在下面看到的那样,我已经编写了 QUERY,但不幸的是它给了我 0 条记录。有人可以帮我解决这个问题吗?我正在使用 Oracle DBMS :) 这是我的数据库的示例:SQL Fiddle
SELECT *
FROM
(SELECT ROWNUM, salary
FROM
(SELECT DISTINCT salary
FROM employees
ORDER BY salary desc)
)
WHERE ROWNUM = 3;
似乎是 Oracle(ROWNUM 并且 Derived Table 没有别名)。 ROWNUM 是针对 结果 行计算的,因此您永远不能过滤任何大于 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;
在标准 SQL、大多数数据库和 Oracle 12C+ 中,您可以改为使用:
SELECT DISTINCT salary
FROM employees
ORDER BY salary desc
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;
我想select TABLE 名员工的第3 份薪水。正如您在下面看到的那样,我已经编写了 QUERY,但不幸的是它给了我 0 条记录。有人可以帮我解决这个问题吗?我正在使用 Oracle DBMS :) 这是我的数据库的示例:SQL Fiddle
SELECT *
FROM
(SELECT ROWNUM, salary
FROM
(SELECT DISTINCT salary
FROM employees
ORDER BY salary desc)
)
WHERE ROWNUM = 3;
似乎是 Oracle(ROWNUM 并且 Derived Table 没有别名)。 ROWNUM 是针对 结果 行计算的,因此您永远不能过滤任何大于 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;
在标准 SQL、大多数数据库和 Oracle 12C+ 中,您可以改为使用:
SELECT DISTINCT salary
FROM employees
ORDER BY salary desc
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;