2014-07-07 2 views
-2

나는 이것이 의미가 있기를 바랍니다.

두 개의 테이블이 있습니다. 표 2에는 표 1의 ID에 대한 외래 키가 있습니다. 표 1에는 생성 된 날짜를 기반으로 새 데이터가 추가되었습니다. 테이블 2 외래 키를 새로운 ID로 어떻게 갱신 할 수 있습니까?테이블의 외래 키 업데이트

Table 1: 
╔═════════════════════════╗ 
║  id code createdDate ║ 
╠═════════════════════════╣ 
║  1 xxx 05/07/2013 ║ 
║  2 xyz 05/07/2013 ║ 
║  3 xxx 07/07/2014 ║ 
╚═════════════════════════╝ 

표 2 :

╔════════════════════════════════╗ 
║  id codeId description  ║ 
╠════════════════════════════════╣ 
║  1 1  xxx description ║ 
║  2 2  xyz description ║ 
╚════════════════════════════════╝ 

나는 역사의 목적을 위해 표 1의 이전 항목을 삭제할 수 없습니다 3과 1로 표 2 codeId을 업데이트해야합니다.

외래 키를 사용할 수 없으며 하위 쿼리의 여러 열을 반환하는 쿼리를 만들었습니다. 이 같은

UPDATE TABLE2 
SET CODEID = (SELECT ID 
       FROM TABLE1 
       WHERE CODE = (SELECT T.CODE 
           FROM TABLE2 
             INNER JOIN (SELECT CODE, 
                  MAX(CREATEDDATE) AS 
                  maxDate 
                FROM TABLE1 
                GROUP BY CODE) tm 
               ON T.CODE = tm.CODE 
                AND T.CREATEDDATE = tm.MAXDATE 
           )) 
+2

여기서 질문을 식별 할 수 없습니다. 당신이 성취하고자하는 것은 무엇이며 어떤 오류가 있습니까? – paqogomez

+0

테이블 1과 테이블 2는 어떻게 링크되어 있습니까? 업데이트하고자하는 외래 키 이외의 다른 필드가없는 것으로 보입니다 (표 2에는 SQL이 암시하는'code' 필드가 없습니다). –

+0

테이블 1 ID 열의 ID 열이 있습니까? –

답변

0

에 작업 예제를 볼 수 있습니다 Table1 레코드의 일부. 구조에서는 Table2.codeId 만 Table1에 대한 링크로 사용합니다.

SELECT t1.id,tmp.latestId 
FROM Table1 t1 
    JOIN (SELECT code,max(id) latestId 
     FROM Table1 
     GROUP BY code 
     HAVING count(*)>1) tmp ON tmp.code=t1.code 

이는 때문에 ID 열로 작동합니다 : 그래서 당신은 최신 버전으로 관련된 기록이다 표에서 각 레코드에 대해 알려줍니다 매핑 테이블의 종류가 필요합니다. 서브 쿼리에 대한 추가 조인이 필요한 날짜 컬럼을 사용하여 수행 할 수도 있습니다.

이제 매핑 테이블을 사용하여 Table2에 가입 할 수 있습니다. 고유 ID로 작업하는 것이 더 안정적이므로 Table1.codeSubstring(Table2.description)을 사용하는 것보다이 방법이 더 좋습니다.

WITH cte (codeId,lastestId) 
AS (
SELECT t1.id,tmp.latestId 
FROM Table1 t1 
    JOIN (SELECT code,max(id) latestId 
     FROM Table1 
     GROUP BY code 
     HAVING count(*)>1) tmp ON tmp.code=t1.code 
)  
UPDATE t2 SET codeId=cte.lastestId 
FROM cte 
    JOIN Table2 t2 ON t2.codeId=cte.codeId 
+1

귀하의 솔루션은 업데이트 진술에 약간의 오타만을 사용합니다. code_id 대신 codeId 여야합니다. – Naveen

0

시도 뭔가 : 내가 제대로 질문을 이해하면

;WITH MAXT 
    AS (SELECT CODE, 
       MAX(CREATEDDATE) createdDate 
     FROM TABLE1 
     GROUP BY CODE), 
    MAXTOTAL 
    AS (SELECT T1.* 
     FROM TABLE1 T1 
       INNER JOIN MAXT T2 
         ON T1.CODE = T2.CODE 
          AND T1.CREATEDDATE = T2.CREATEDDATE) 
UPDATE T2 
SET codeid = T1.ID 
FROM TABLE2 T2 
     INNER JOIN MAXTOTAL T1 
       ON T1.CODE = LEFT(T2.DESCRIPTION, 3) 

SELECT * 
FROM TABLE2 

당신은 당신이 새로운 버전으로 표 2를 업데이트 할 사항이 있거나, SQL Fiddle

+0

내 질문이 완전히 명확하지 않았던 것 같습니다. 설명 열을 사용하고 코드 이름의 길이가 고정 된 경우에만 솔루션이 작동합니다. 실제 테이블에서는 설명이 코드 이름으로 시작하지 않습니다. – Naveen