使用内部 select 更新 - oracle
Update with inner select - oracle
wk_remark table 看起来像这样
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 = 中的案例,我的查询必须更新 action_user_id = 900 654;
所以,输出应该是这样的,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 记录,
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
我的内部 select 应该是什么样子以及如何只更新 2 条记录。请告诉我。
谢谢。
您必须使用 window 函数对 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)
wk_remark table 看起来像这样
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 = 中的案例,我的查询必须更新 action_user_id = 900 654;
所以,输出应该是这样的,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 记录,
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
我的内部 select 应该是什么样子以及如何只更新 2 条记录。请告诉我。 谢谢。
您必须使用 window 函数对 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)