문제
테이블에 더 많은 행을 추가하기위한 기초로 사용하고 싶은 선정 된 진술이 있습니다. 새 행에는 일부 열이 수정되고 원래 행도 변경해야합니다.
이것은 한 번만 발생하지 않으며 DB가 도움이되면 오프라인으로 취할 수 있습니다.
어떤 아이디어?
고마워요, 조
=================
설명 업데이트
MBANK 테이블
| 중간 | 마그네이트 | mtypeot | Mavails | muser | mts
낡은 |65 | 9| 3| 2| A|NAME |20090909
새로운 |65 | 10| 0| 2| A|NAME |20090910
변화 |SAME | +1| TO 0| SAME|New = A Old = O|SAME |TIMESTAMP
선택에서 약 4000 개의 레코드에 대해 수행해야합니다.
mdstd.mbank에서 *를 선택하십시오. 여기서 mtypeot = '2'및 mavails = 'a'
해결책
Drjokepu 솔루션은 괜찮지 만 질문에서 "변경"이라고 부르는 것이 고정되어 있는지에 따라 다릅니다. IE : 두 번째 열에서 항상 +1을 변경 하시겠습니까? 아니면 이러한 변경 사항이 런타임을 결정 해야하는 방식으로 "동적"을 적용 할 것인가?
DB2 및 기타 SQL 다른 구조물 (DB2에 삽입)이 있거나 쿼리 세트를 구성 할 수있는 MS-SQL로 선택하십시오.
내가 착각하지 않으면, 당신은 이것을하고 싶다 :
- Select에서 나오는 테이블에 값을 삽입하십시오 ( "Old"라고 부릅니다).
- "오래된"레코드 세트를 만들지 만 값을 수정하십시오.
아니면 2 번만하고 싶을 수도 있습니다.
Dr.Jokepu가 이미 보여 주었던 것처럼 1 번은 쉽습니다.
INSERT INTO <table> (values) SELECT "values" FROM <anotherTable>;
2 번은 동일한 쿼리에서 언제든지 선택할 수 있습니다. 선택한대로 변경 사항을 추가 할 수 있습니다.
INSERT INTO MDSTD.MBANK ( MID, MAGN, MAAID, MTYPEOT, MAVAILS, MUSER, MTS)
SELECT
MID
,MAGN + 1
,0 as MAAID
,MTYPEOT
,'A' as MAVAILS
,MUSER
,GETDATE()
FROM mdstd.mbank
WHERE MTYPEOT = '2' and MAVAILS = 'A'
(getDate ()는 MS-SQL 기능이므로 현재 DB/2의 정확한 기능을 기억하지 못합니다).
한 가지 질문이 남아 있습니다. 예에서는 다음과 같이 언급했습니다.
"new = old = o"
오래된 "O"로 변경되면 원래 행을 정말로 변경하고 싶습니까? 이 질문에 대한 답은 당신이 달성하고자하는 정확한 작업에 달려 있으며, 여전히 나에게는 명확하지 않습니다.
행을 복제하고 "사본"을 변경하거나 복사하고 두 세트 (기존 및 신규)를 변경하지만 다른 규칙을 사용하려는 경우.
업데이트귀하의 게시물을 다시 읽은 후 나는 당신이 이것을하고 싶다는 것을 이해합니다.
- 레코드 세트를 복제하지만 (효과적으로 복사) 값을 수정하십시오.
- 원래 레코드 세트를 수정하십시오 ~ 전에 당신은 그들을 복제했습니다
이 경우, "두 개의"쿼리로 할 수 있다고 생각하지 않습니다. 왜냐하면 이미 복제 된 경우 오래된 행이 무엇인지 알 수 없기 때문입니다.
유효한 옵션은 임시 테이블을 작성하고 그곳에서 행을 복사하는 것입니다 (내가 제공 한 쿼리와 함께 "새 제품으로 수정). 그런 다음 원본 테이블에서"업데이트 "(동일한 위치 절을 사용하여 만들기”를 실행하는 것입니다. 동일한 행을 수정할 수 있습니다), 업데이트하려는 모든 것을 사용하여 "오래된"값을 업데이트하고 마지막으로 새 제품을 이미 수정 된 원래 테이블 ( "New")에 다시 삽입하십시오. 마지막으로, 마지막으로, 임시 테이블.
휴!
이상하게 들리지만, 우리가 매분의 수백만 레코드에 대해 이야기하지 않는 한, 이것은 일종의 빠른 운영이어야합니다.
다른 팁
DB2 특정 구성 인 삽입 ... SELECT를 사용할 수 있습니다.
INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337
그런 다음 동일한 거래에서 원래 행을 수정하기 위해 동일한 위치 조항으로 업데이트를 수행합니다.
UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337
DB2는 단일 배치로 여러 명령을 지원하므로 함께 배치 할 수 있습니다.
INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337;
UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337;