当我必须按“按案例排序”时,无法“更新设置地点”

时间:2017-12-12 13:48:46

标签: 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'
         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
     ;

同时我现在想要仅在上面查询返回的单行中更新值为100的sys_annot字段,即:

update BILL SET SYS_ANNOT=100
where ????

无论我尝试什么它都行不通,在这里你的帮助。 感谢

2 个答案:

答案 0 :(得分:2)

您应该使用主键来标识行的唯一记录。在这种情况下您可以使用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);

如果您确定只返回一行,则可以使用 = 代替中的

答案 1 :(得分:0)

不确定我理解这个问题,但你不能再嵌套另一个陈述吗?

我的意思是你可以在开头添加update BILL SET SYS_ANNOT=100 where ????,例如:

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
     );