Oracle 10G PL/SQL- 업데이트 열 값으로 결과를 선택합니다.
문제
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를 반복하고 테이블을 업데이트 할 수 있습니다.
제휴하지 않습니다 StackOverflow