2017-12-12 2 views
1

내가 잘 작동 다음 쿼리는 (나에서 다른 게시물을 참조) 때 경우에 의해 순서 "로 주문해야 할 때.하지 수에 "UPDATE의 SET WHERE"나는

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 
    ; 

을 동시에 I 단지 위의 질의에 의해 반환되는 단일 행의 값 (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 (some sub query)'와 같은 것을 사용하여 임시 보관 테이블 또는 * (아래 답변에 있음)입니다. – MatBailie

+1

또한 '무엇이든지 시도하십시오'라고 말하면 실제로 시도한 것을 보여주십시오. '작동하지 않는다 '고 말할 때, 에러 메시지 (에러 메시지 포함), 예기치 않은 결과 (당신이 얻은 결과와 예상 한 결과)를 구체적으로 적어주십시오. – MatBailie

답변

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

당신이에 =대신 를 사용할 수 있습니다.

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는 단 하나만 필요합니다. –