我有这个表,我正在尝试更新列。事情是有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的影响。
我试过寻找类似的问题,但无法找到任何东西。 任何帮助深表感谢!
答案 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
);