【问题标题】:Update with inner select - oracle使用内部选择更新 - oracle
【发布时间】:2020-08-27 12:00:05
【问题描述】:

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 条记录。请告诉我。 谢谢。

【问题讨论】:

  • 您的数据看起来不正确,因为只有 1201 有 654 条记录,但您的输出有 3 条记录
  • @VN'sCorner .. 1201 的最新序列是 5,其状态为 CD,因此不应选择。
  • 但 action_user_id 为 Null,您希望仅在 action_user_id 为 654 且 status_cd 不在 ('CL', 'CD') 中时选择?我错过了什么吗?
  • @VN'sCorner 我必须在每个案例中选择最新的,这些案例的 action_user_id 应该有 action_user_id = 654 并且 status_cd 不在('CL','CD')
  • 不应选择 1201,因为最新的 1201 没有 action_user_id = 654

标签: java sql oracle oracle11g


【解决方案1】:

您必须使用窗口函数对 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',但就预期结果而言,这看起来是正确的:dbfiddle.uk/… 编辑:这实际上是他在问题中提供的选择语句中的错字,所以我可以看到这是怎么发生的。
  • @Dresden - 更正了错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多