문제

Oracle 10G의 쿼리에서 레코드 값을 가진 테이블에서 여러 열을 쉽게/우아하게 업데이트 할 수있는 방법이 있습니까?

단순성을 위해 2 개의 열을 갖는 테이블 (소스 호출)이 있습니다. ID 그리고 KEY.

ID     Key
----   ---- 
1        1000
2        1000
3        5000
4        1000
..
101      8000
102      9000
103      7000
104      9000
...
201         5
202         5
...

다른 테이블이 있습니다 (전화하십시오 KeyMap) 그건 가져옵니다 trunc(ID/100) 그리고 그것을 a로 사용합니다 batchID 열이 배치 내 ID에 대한 키 맵이기도합니다.

trunc(ID/100)   key1   key2   key3   key4 ..... key99
-------------   ----   ----   ----   ----
0               1000   1000   5000   1000
1               8000   9000   7000   9000
2                  5      5               

ID는 배치로 생성되고 처리되므로 배치 처리가 끝날 때 저장 프로 시저를 호출하여 레코드를 업데이트하고 싶습니다. KeyMap 새로운 테이블 Key 해당 주요 값을 제공하는 하위 선택 또는 컬렉션을 사용하여 1 업데이트 명령문이있는 값.

이것이 가능하고이를 수행하는 가장/가장 효율적인 방법은 무엇입니까?

도움이 되었습니까?

해결책

나는 당신의 테이블 디자인이 정규화되지 않았으며 그다지 예쁘지 않다고 말하기 위해 나의 비판을 제한하겠습니다. 그러나 당신의 이유가 있다고 가정 할 것입니다. 나는 일반적으로 Decode를 집계 열과 결합하여 내 키별로 그룹화하여 이러한 "회전"쿼리를 수행합니다.이 경우 의사 키, Trunc (ID/100). 이를 튜플을 사용하는 업데이트 구문과 결합하십시오.

 UPDATE Foo
    SET (a, b, c, d)
      = (w, x, y, z);

그리고 당신은 얻는다 :

  UPDATE KeyMap
     SET
       ( key1
       , key2
       , key3
       , key4
       ...
       , key99
       )
       = ( SELECT MAX(decode(mod(ID, 100), 1, Key, NULL))
                , MAX(decode(mod(ID, 100), 2, Key, NULL))
                , MAX(decode(mod(ID, 100), 3, Key, NULL))
                , MAX(decode(mod(ID, 100), 4, Key, NULL))
                ...
                , MAX(decode(mod(ID, 100), 99, Key, NULL))
             FROM Source
            WHERE Trunc(Source.ID / 100) = KeyMap.batchId
            GROUP BY Trunc(Source.ID / 100)
         )
   WHERE BatchId = <x>;

다른 팁

오라클을 생성 할 수 있습니다 Varray 키를 배치로 전달하십시오. 귀하의 절차는 Varray를 반복하고 테이블을 업데이트 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top