문제

테이블에 더 많은 행을 추가하기위한 기초로 사용하고 싶은 선정 된 진술이 있습니다. 새 행에는 일부 열이 수정되고 원래 행도 변경해야합니다.

이것은 한 번만 발생하지 않으며 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로 선택하십시오.

내가 착각하지 않으면, 당신은 이것을하고 싶다 :

  1. Select에서 나오는 테이블에 값을 삽입하십시오 ( "Old"라고 부릅니다).
  2. "오래된"레코드 세트를 만들지 만 값을 수정하십시오.

아니면 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"로 변경되면 원래 행을 정말로 변경하고 싶습니까? 이 질문에 대한 답은 당신이 달성하고자하는 정확한 작업에 달려 있으며, 여전히 나에게는 명확하지 않습니다.

행을 복제하고 "사본"을 변경하거나 복사하고 두 세트 (기존 및 신규)를 변경하지만 다른 규칙을 사용하려는 경우.

업데이트귀하의 게시물을 다시 읽은 후 나는 당신이 이것을하고 싶다는 것을 이해합니다.

  1. 레코드 세트를 복제하지만 (효과적으로 복사) 값을 수정하십시오.
  2. 원래 레코드 세트를 수정하십시오 ~ 전에 당신은 그들을 복제했습니다

이 경우, "두 개의"쿼리로 할 수 있다고 생각하지 않습니다. 왜냐하면 이미 복제 된 경우 오래된 행이 무엇인지 알 수 없기 때문입니다.

유효한 옵션은 임시 테이블을 작성하고 그곳에서 행을 복사하는 것입니다 (내가 제공 한 쿼리와 함께 "새 제품으로 수정). 그런 다음 원본 테이블에서"업데이트 "(동일한 위치 절을 사용하여 만들기”를 실행하는 것입니다. 동일한 행을 수정할 수 있습니다), 업데이트하려는 모든 것을 사용하여 "오래된"값을 업데이트하고 마지막으로 새 제품을 이미 수정 된 원래 테이블 ( "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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top