2013-03-21 5 views
0

현재 비트 맵 테이블을 업데이트 할 업데이트 문을 작성 중입니다. 다음을 수행합니다.DB2 업데이트의 하위 쿼리 반복

모든 ID에 대해 모든 행을 업데이트하고 RELATION_ID를 최신 행의 RELATION_ID로 설정합니다. 이 쿼리에서

도하고 (내가 먼저 업데이트하는 데 사용되는 값을 얻기 위해 그것을 사용하기 때문에)

이 있는가 (나는 이미이 RELATION_ID이 행을 업데이트하지 않음) 반복 하위 쿼리가 ? 방법 (필수 프로그램없이, 순수 SQL) 첫 번째 쿼리의 값 또는 대안을 재사용

UPDATE TBL_CLIENT UPD 
SET RELATION_ID = (
        SELECT RELATION_ID FROM TBL_CLIENT SUBQ 
        WHERE UPD.ID = SUBQ.ID AND 
         UPDATE_TIMESTAMP = (
              SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT SUBSQ 
              WHERE SUBSQ.ID = SUBQ.ID 
              ) 
       )    
WHERE ID IN ( 
        SELECT ID 
        FROM TBL_CLIENT QU 
        GROUP BY ID 
        HAVING COUNT(DISTINCT(RELATION_ID)) > 1 
        ) AND   
     RELATION_ID <> (
         SELECT RELATION_ID FROM TBL_CLIENT SUBQ2 
         WHERE UPD.ID = SUBQ2.ID AND 
           UPDATE_TIMESTAMP = (
                -- Update mit STID des neusten Eintrages 
                SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT SUBSQ2 
                WHERE SUBSQ2.ID = SUBQ2.ID 
               ) 
        ) 

예 :

ID/RELATION_ID/UPDATE_TIMESTAMP

,515,
  • 10분의 1/2000년 1월 1일
  • 12분의 1/2002년 1월 5일
  • 15분의 1 업데이트 후에/2008년 3월 28일

:

  • 15분의 1/1.1.2000
  • 1/15/5.1.2002
  • 1/15/28.3.2008

마지막 행에 따라서는 (!와 행 자체가 업데이트되지 않은 여기에 포함되지 않은 쿼리의 다른 부분에 대한 중요한) 관계 ID가 찍은

감사의, 가장 최근의 행이었다 모든 추천에 대해

+0

조언은'update'를'merge'로 대체하는 것입니다. . . http://stackoverflow.com/questions/4184209/inner-join-in-update-sql-for-db2. –

+0

테이블의 기본 키는 무엇입니까? –

+0

기본 키는 ID, 시간 소인을 포함하여 다중 요소로 구성되지만 Relation_Id – Xavjer

답변

0

당신은 뷰 업데이트 할 수 있습니다) 사이베이스 당과 같습니다

UPDATE 
    (SELECT t.id, t.update_timestamp, ...  --- all the PK columns 
      t.relation_id, 
      m.relation_id AS new_relation_id 
    FROM 
     TBL_CLIENT AS t 
     JOIN 
     (SELECT id, relation_id, 
       ROW_NUMBER() OVER (PARTITION BY id 
            ORDER BY update_timestamp DESC) 
        AS rn 
      FROM TBL_CLIENT 
     ) AS m 
     ON m.id = t.id 
    WHERE m.rn = 1 
     AND m.relation_id <> t.relation_id 
) AS upd 
SET 
    relation_id = new_relation_id ; 
+0

max tsd에 대한 내 파트로 JOIN을 변경하면 select가 필요한 모든 값을 반환하지만 업데이트로 작동하지 않습니다 :/ – Xavjer

+0

내 대답은 작동하지 않습니까? 사용중인 DB2 버전은 무엇입니까? –

+0

편집을 참조하십시오. PK를 포함시켜야 할 것입니다. –

0

이것은 당신을 위해 작동 할 수도 있습니다 - (나는 정확한 구문을 모른다. 난 사이베이스 작업, 그래서 이것은

UPDATE TBL_CLIENT AA 
    SET RELATION_ID = BB.RELATION_ID 
FROM 
    TBL_CLIENT AA, 
    TBL_CLIENT BB 
WHERE 
    AA.ID=BB.ID 
    AND BB.UPDATE_TIMESTAMP=(SELECT MAX(UPDATE_TIMESTAMP) FROM TBL_CLIENT CC WHERE CC.ID=BB.ID) 
+0

은 포함하지 않거나 원하는 샘플 데이터와 예상 출력을 제공합니다. – DSD

+0

실제로 DB2의 업데이트에 하나 이상의 테이블을 정의 할 수 없으며 FROM 진술이 존재하지 않는다면 가능한 한 좋은 해결책이 될 것입니다. 작은 게시물로 내 게시물을 업데이트 할 것입니다 – Xavjer

-1

은 아마 업데이트하기 전에/애프터으로 트리거를 사용할 수 있습니다.