基于订单依据的Oracle Update前20条记录

时间:2018-06-12 15:32:53

标签: sql oracle

我有这个表,我正在尝试更新列。事情是有40条记录,我通过影响订购。然后,我想采取前10名(基于他们的影响)并更新它们

UPDATE mytable
SET status = 'red'
WHERE status IN
(

    SELECT status
      FROM (
        SELECT *
        FROM mytable
        WHERE status = 'green'
        ORDER BY impact DESC
        )
)
AND ROWNUM <= 10

我尝试将ROWNUM放在WHERE IN语句中,但它会忽略它并更新所有40条记录。当我这样做时,我如何拥有它然后它选择10但它没有选择前十名它只是随机选择它们。我猜它忽略了ORDER BY的影响。

我试过寻找类似的问题,但无法找到任何东西。 任何帮助深表感谢!

3 个答案:

答案 0 :(得分:1)

它正在使用您想要特定记录的状态更新任何记录。在您的where子句中,尝试使用id列而不是status

#!/usr/bin/env ruby

require 'mymodule/foo'

# require 'foo.rb'

答案 1 :(得分:1)

如果是我,我会使用dense_rank 你可能有一个边缘情况,多个行的影响是相同的,所以你可能会得到超过40行

不确定状态是否是您想要的实际列,例如您可能希望PK驱动更新的其他答案

UPDATE mytable
SET status = 'red'
WHERE status IN
(

    SELECT status
      FROM (
        SELECT status, dense_rank() over (order by impact desc) color_rank
        FROM mytable
        WHERE status = 'green'
        )
      where color_rank <= 40
)

答案 2 :(得分:1)

这可能会解决:

UPDATE mytable
SET status = 'red'
WHERE status IN
(

    SELECT level_0_impact
      FROM (
        SELECT impact level_0_impact
        FROM mytable
        WHERE status = 'green'
        ORDER BY impact DESC
        )
    where rownum <=10
);

我刚刚使用hr.employees测试了它的工作原理:

update hr.employees
set salary=99999
where salary in 
(select level0
   from (
          select salary level0
          from hr.employees
          order by salary desc)
   where rownum < 4 
);