0 oracle
当我运行下面的查询时,我收到 0 行更新消息。为什么?有任何想法吗?
Update salespersons set salespersons.salary = salespersons.salary * 1.12
where salespersons.empid =
(SELECT salespersons.empid
FROM (SELECT *
FROM (SELECT *
FROM (SELECT s.empid employeeid,
s.ename employeename,
SUM(i.price * oi.qty) - s.salary Topprofit
FROM salespersons s
LEFT JOIN orders o ON s.empid = o.empid
LEFT JOIN orderitems oi ON o.orderid = oi.orderid
LEFT JOIN inventory i ON oi.partid = i.partid
GROUP BY s.empid, s.ename, s.salary)
ORDER BY Topprofit DESC)
WHERE ROWNUM = 2
ORDER BY Topprofit ASC)
WHERE ROWNUM = 1 and Topprofit is not null);
Run Code Online (Sandbox Code Playgroud)
以下 SQL 永远不会返回任何行:
select * from <whatever> where rownum = 2;
Run Code Online (Sandbox Code Playgroud)
该rownum
伪列编号在结果集中的行。where
过滤器之前的第一个候选行将被分配rownum
为 1 并由于 where 子句而被丢弃。第二个候选行将再次被分配rownum
为 1 并被丢弃,依此类推。
还要小心组合rownum
和order by
从句。默认值不会执行您想要的操作,它会在分配了行号后进行排序。(因此,order by
在选择带有rownum
过滤器的单行之后是没有意义的。)请查看ROWNUM
文档以获取有关如何执行“前 N”查询的示例。
您可以通过在子查询中“具体化”它来选择特定的行号:
select * from (
select foo, bar, rownum rnk
from some_table
order by bar, foo
) where rnk = 42;
Run Code Online (Sandbox Code Playgroud)
如果完全有可能出现空值,您最好早点过滤掉空值(如果可以的话,在最嵌套的查询中将它们过滤掉)。并且上述技巧对 不起作用group by
,因此使用ROW_NUMBER()
解析函数会更合适。
假设你想给一个不错的加薪给员工排在第2次的Topprofit
,可以立足于这样的查询:
SELECT
s.empid employeeid,
SUM(i.price * oi.qty) - s.salary Topprofit
ROW_NUMBER() OVER (ORDER BY SUM(i.price * oi.qty) - s.salary desc) rnk
FROM salespersons s
LEFT JOIN orders o ON s.empid = o.empid
LEFT JOIN orderitems oi ON o.orderid = oi.orderid
LEFT JOIN inventory i ON oi.partid = i.partid
GROUP BY
s.empid, s.ename, s.salary
HAVING
SUM(i.price * oi.qty) - s.salary is not null
Run Code Online (Sandbox Code Playgroud)
把它包起来select employeeid from (...) where rnk = 2
,你应该很高兴。
归档时间: |
|
查看次数: |
576 次 |
最近记录: |