Sql 无法“更新设置位置”,当我必须使用“按情况订购时”
我有下面的问题,这很好,请看我的其他帖子Sql 无法“更新设置位置”,当我必须使用“按情况订购时”,sql,oracle,sql-update,sql-order-by,case,Sql,Oracle,Sql Update,Sql Order By,Case,我有下面的问题,这很好,请看我的其他帖子 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'
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
;
不管我怎么做都不管用,请你帮忙。
谢谢您应该使用主键来标识行的唯一记录。在这种情况下,您可以使用rowid,这仅适用于Oracle。这对于多行来说效率不高,但对于一行来说就足够了:
update BILL b SET SYS_ANNOT=100
where b.rowid in (
SELECT rid from (
SELECT bill.rowid rid, 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);
如果您确定只返回一行,则可以使用=而不是in。我不确定我是否理解这个问题,但您是否可以嵌套另一个语句 我的意思是,您可以添加更新账单集SYS_ANNOT=100 从哪里开始,比如:
update BILL SET SYS_ANNOT=100
where SYS_ANNOT = (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
);
在我个人看来,甲骨文让这变得更加困难。其他方言允许以各种形式更新x集y=x。我所知道的唯一答案要么是临时保留表,要么是现在在下面的答案中,在一些子查询中使用类似target_table.primary_键的东西。另外,当你说我想说的任何话时,请se显示您实际尝试过的内容。当您说“不起作用”时,请具体说明:错误消息包括错误消息,意外结果显示您得到的结果以及您期望的结果。此查询可以更新多条记录,而OP只需要一条记录。
update BILL SET SYS_ANNOT=100
where SYS_ANNOT = (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
);