2017-12-12 33 views
1

は私が(私からの他の記事を参照)は正常に動作し、次のクエリを持っているとき場合によって順序」と注文する必要があり、「UPDATEのSET」。私は同時に私は

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 ???? 

おかげ

+0

オラクル*:

は、私は何を意味することは、同様に、初めにupdate BILL SET SYS_ANNOT=100 where ????を追加することができます。 他の方言では、さまざまな見方で 'UPDATE x SET y = x FROM 'が可能です。私が知っている唯一の答えは、 'target_table.primary_key IN(いくつかのサブクエリ)'のようなものを使って、一時的にテーブルを保持するか、*(以下の答えにある)*です。 – MatBailie

+1

また、「何でも試してみてください」と言ったら、実際に試したことを示してください。 '動作しない 'と言うときは、エラーメッセージ(エラーメッセージを含む)、予期しない結果(得られた結果と期待した結果)を特定してください。 – MatBailie

答えて

2

プライマリキーを使用して、行の一意のレコードを識別する必要があります。このような場合は、ROWIDを使用できます(Oracleのみで動作します)。これは、複数の行のために非常に効率的ではないだろうが、1行分のそれは十分良いでしょう:あなたが唯一の1行が返されることが確実な場合

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

あなたはに代わり=を使用することができます。

0

私は質問を理解していますが、別の声明を入れ子にすることはできませんか? *それは必要以上にこの難しくなります(私の個人的意見では)

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

このクエリは複数のレコードを更新できますが、OPには1つしか必要ありません。 –

関連する問題