2009-09-08 4 views
0

한 테이블에서 다른 테이블로 편집 내용을 병합하는 SQL 문이 있습니다. 나는. 이 모든 누적 수정 사항을 포함로이 SQL 문을 더 잘 수행 할 수 있습니까?

UPDATE f 
SET f.AUDAPLCDE = m.AUDAPLCDE, f.AUDSTF_NO = m.AUDSTF_NO, 
f.AUDUPD_ID = m.AUDUPD_ID, f.AUDUPDDTE = m.AUDUPDDTE, 
f.UNTTYP = m.UNTTYP, f.UNTSTM_NO = m.UNTSTM_NO, 
f.UNTIND = f.UNTIND, f.UNQ = m.UNQ,  
f.TRNCTL_NO = m.TRNCTL_NO, f.TRN_NO = m.TRN_NO, 
f.STAEVT = m.STAEVT, f.SPSDTE = m.SPSDTE, 
f.RVRRSN = m.RVRRSN, f.AUDUPDTME = m.AUDUPDTME, 
f.RHTTYP = m.RHTTYP, f.ALCADJ = m.ALCADJ, 
f.RESFAC = m.RESFAC, f.PRTDTE = m.PRTDTE, 
f.POLREF = m.POLREF, f.OUTFAC = m.OUTFAC, 
f.OTHBENQTY = m.OTHBENQTY, f.ORIIND = m.ORIIND, 
f.ORIDTE = m.ORIDTE, f.INRTYP = m.INRTYP, 
f.INRREF = m.INRREF, f.FNDTRNTYP = m.FNDTRNTYP, 
f.FNDSUBTYP = m.FNDSUBTYP, f.FNDREF = m.FNDREF, 
f.FNDPRC = m.FNDPRC, f.EVTUNQ = m.EVTUNQ, 
f.EVTTRN_NO = m.EVTTRN_NO, f.EFVDTE = m.EFVDTE, 
f.DUEDTE = m.DUEDTE, f.CTBPCT = m.CTBPCT, 
f.CO_REF = m.CO_REF, f.CAL_YR = m.CAL_YR, 
f.BONSUBTYP = f.BONSUBTYP, f.BONSTA = m.BONSTA, 
f.BONDCL_YR = m.BONDCL_YR, f.BON_YR = m.BON_YR, 
f.BENTYP = m.BENTYP, f.BENREF = m.BENREF, 
f.BENQTY2 = m.BENQTY2, f.BENQTY1 = m.BENQTY1, 
f.AMT = m.AMT, f.ALCRTE = m.ALCRTE 
FROM FI700 f 
INNER JOIN MERGEDATA_FI700 m ON m.FI700_UNIQUE_ID = f.FI700_UNIQUE_ID 
          AND m.SSIS_UPDATE_TYPE = 'U' 
          AND m.SSIS_TIMESTAMP in (SELECT max(mm.SSIS_TIMESTAMP) 
                 FROM MERGEDATA_FI700 mm 
                 WHERE mm.FI700_UNIQUE_ID = m.FI700_UNIQUE_ID 
                 AND mm.SSIS_UPDATE_TYPE = 'U') 

정말, 난 그냥, 필드 (타임 스탬프에 의해) 최신 편집을 위해 노력하고있어. 나는 이것이 더 잘 수행되도록 만들 수 있다고 확신한다. 즉, 어쨌든 SELECT max(mm.SSIS_TIMESTAMP) ... 중첩 된 쿼리를 그 위에있는 조인에 통합한다.

의견이 있으십니까?

답변

2

두 개의 작은 것들 -하지만, 그들은 큰 차이를 만들 경우하지 않도록 :

AND m.SSIS_TIMESTAMP in (SELECT max(mm.SSIS_TIMESTAMP) 
          FROM MERGEDATA_FI700 mm 
          WHERE mm.FI700_UNIQUE_ID = m.FI700_UNIQUE_ID 
          AND mm.SSIS_UPDATE_TYPE = 'U') 

1) 사용할 수 있습니다 SSIS_TIMESTAMP에 인덱스가 있습니까? 당신은 MAX 값을 선택하고 있기 때문에

2), 대신 "IN"연산자의 등호를 사용할 수 있습니다

AND m.SSIS_TIMESTAMP = (SELECT max(mm.SSIS_TIMESTAMP) 

마크

+0

사실, 타임 스탬프에 인덱스가 없다. ID 필드와 UPDATE_TYPE 필드에 추가했습니다. '='주석 주셔서 감사합니다. –

+0

SELECT max() 쿼리를 보면, 거기에서 선택한 세 필드를 모두 사용하기 때문에 (FI700_UNIQUE_ID, SSIS_UPDATE_TYPE, SSIS_TIMESTAMP)에 인덱스를 만들 수 있습니다. –

+0

@marc_s : 앞으로 나아가 야하지만 어쨌든 고마워요 :) –