【发布时间】:2017-12-12 13:48:45
【问题描述】:
我有以下查询可以正常工作(请参阅我的其他帖子)。
SELECT sys_annot from (
SELECT SYS_ANNOT, row_number() over (order by case when prep_seq_num = 0 then 1 else 2 end) as rn
FROM BILL
WHERE BIMA_TRACKING_ID = 10
AND BSCO_CODE_ID = 'PINGPONG'
AND PARTITION_KEY = '06-DEC-17'
AND SUBPARTITION_KEY = 84
AND
(
( PREP_SEQ_NUM = 0
AND ITEM_CAT_CODE_ID=1
AND PRIMARY_IND=0
AND CHRG_ACCT_ID = 1
AND SYS_ANNOT <> 0
)
OR
( PREP_SEQ_NUM <> 0
AND ITEM_CAT_CODE_ID in ('5', '-100')
AND PRIMARY_IND=1
)
)
)
where rn=1
;
同时我现在想只在上面查询返回的单行中更新 sys_annot 字段的值为 100,即:
update BILL SET SYS_ANNOT=100
where ????
无论我尝试什么都行不通,请在这里提供帮助。 谢谢
【问题讨论】:
-
Oracle (在我个人看来) 使这比它需要的更难。其他方言允许
UPDATE x SET y = x FROM <some sub_query>以各种形式出现。我知道的唯一答案要么涉及临时保留表,要么(现在在下面的答案中出现)使用类似target_table.primary_key IN (some sub query)的东西。 -
另外,当您说
whatever I try时,请展示您实际尝试过的内容。当您说does not work时,请具体说明:错误消息(包括错误消息)、意外结果(显示您得到的结果以及您预期的结果)。
标签: sql oracle sql-update sql-order-by case