使用内部选择 - Oracle 进行更新



wk_remark表看起来像这样

id  case_id seq action_user_id status_cd
100 1201    1   321             CW
101 1201    2   421             TI
102 1201    3   521             AS
103 1202    1   600             CW
104 1201    4   654             BV
105 1202    2   654             TI
106 1203    1   654             AS
107 1201    5                   CD  

对于最新case_id不在("CL"、"CD"(和 action_user_id = 654 的情况下,我的查询必须更新 action_user_id = 900;

因此,输出应如下所示,case_id 1201 将不会更新,因为 1201 的最新case_id seq=5,id = 107 具有 status_cd = 'CD'。 case_id = 1202 和 1203 的事例应更新为 action_user_id = 900。

id  case_id seq action_user_id status_cd
100 1201    1   321             CW
101 1201    2   421             TI
102 1201    3   521             AS
103 1202    1   600             CW
104 1201    4   654             BV
105 1202    2   900             TI
106 1203    1   900             AS
107 1201    5                   CD

我使用下面的查询首先选择记录,

SELECT max(seq), case_id 
FROM wk_remark 
WHERE action_user_id = 654 and status_cd not in ('CL', 'CD')
GROUP BY case_id 
ORDER BY case_id;

我期待 2 条记录,但我得到 3 条,

id  case_id seq action_user_id status_cd
104 1201    4   654             BV
105 1202    2   654             TI
106 1203    1   654             AS

我的内部选择应该是什么样子的,我如何只更新 2 条记录。请让我知道。 谢谢。

您必须使用窗口函数按降序对 seq 进行排序,以根据 seq 列选择最新的一个,然后更新该记录。

update wk_remark 
set action_user_id = 900 
where exists 
(
select 1 from 
(select id,case_id,seq,action_user_id,status_cd,row_number() over (partition by case_id order by seq desc) rn
from wk_remark) tab
where rn = 1
and action_user_id = 654 
and status_cd not in ('CL','CD')
and tab.id = wk_remark.id)

相关内容

  • 没有找到相关文章