Oracle 10 更新查询

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)

Mat*_*Mat 5

以下 SQL 永远不会返回任何行:

select * from <whatever> where rownum = 2;
Run Code Online (Sandbox Code Playgroud)

rownum伪列编号在结果集中的行。where过滤器之前的第一个候选行将被分配rownum为 1 并由于 where 子句而被丢弃。第二个候选行将再次被分配rownum为 1 并被丢弃,依此类推。

还要小心组合rownumorder 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()解析函数会更合适。

假设你想给一个不错的加薪给员工排在第2Topprofit,可以立足于这样的查询:

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,你应该很高兴。