Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法“更新设置位置”,当我必须使用“按情况订购时”_Sql_Oracle_Sql Update_Sql Order By_Case - Fatal编程技术网

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