2014-02-28 1 views
0

복잡한 갱신 : 오라클 - 나는 ID 열에서 같은 키를 저장하는 두 테이블이

CREATE TABLE "TESTA" 
    ( "RECORD_STATUS" VARCHAR2(4 BYTE), 
    "ID" NUMBER, --this is PK 
    "BATCH" NUMBER 
    ); 
CREATE TABLE "TESTB" 
    ( "ID" NUMBER, --this is unique FK to TESTA.ID 
    "BATCH" NUMBER); 

내가이 시험 테이블에 약 20 테스트 기록을 삽입.

요구 사항 : ID을 사용하여 두 테이블을 결합하고 TESTA.RECORD_STATUS DESC을 사용하여 정렬 한 다음열을 매 5 행마다 1 씩 증가 (0부터 시작)하여 업데이트하십시오.

MERGE INTO TESTB st 
USING(SELECT A.rowid as rid, 
      ROW_NUMBER() OVER (ORDER BY A.RECORD_STATUS DESC) as rn 
     FROM TESTA A) t 
ON(st.ROWID=t.RID) 
WHEN MATCHED THEN 
UPDATE SET st.BATCH=CEIL(t.rn/5); 

문제 : 출력이 0 행이 합병 말한다, 그러나 나는 업데이트에 모든 행을 기대하고

이것은 내가 지금까지 가지고있는 것입니다.

예상대로 달성하는 방법에 대한 통찰력을 크게 얻었습니다. 나는 아무것도 놓치지 않았 으면 좋겠다.

+0

ROWID를 각 레코드에 대해 고유 한 주소입니다. 한 테이블의 행에있는 ROWID가 다른 테이블의 ROWID와 일치하는 것을 기대하지 않을 것입니다. –

답변

1

당신은 update하여이 작업을 수행 할 수 있습니다

update testb 
    set b.batch = (select trunc((seqnum - 1)/5) 
        from (select a.*, row_number() over (order by a.record_status desc) as seqnum 
         from testa 
         ) a 
        where a.id = testb.id and 
       ) 
    where exists (select 1 from testa a where a.id = testb.id); 
+0

@ user3224907 . . 나도 그렇게 생각해. 'update'로 할 수있는 일은'merge'로 할 수 있어야합니다. –

관련 문제