테이블 overwright (ms sql) 0 5 1,338

by 갈매기 [SQL Query] table update [2018.06.05 01:44:44]


안녕하세요? 

매주 테이블을 업데이트 하고 있습니다. 매주 최신 한달의 값으로 업데이트를 합니다. 테이블의 내용중에 지난주에 있는 내용과 이번주의 내용(PK)이 겹치면, 이번주의 값으로 overwright 해야 합니다.  PK: CanisterId

1. 지난주 테이블

CanisterId CreatedDtm CanisterBuildNum reason
16143087616091395733 20180529131116 58 Overdrop
16143087616092094861 20180529131116 4 Overdrop
16143088887720586765 20180529131116 17 Overdrop
16143088887720598318 20180529131116 208 Overdrop
16143088887720608063 20180529131116 17 Overdrop
16143088887720648072 20180529131116 59 Overdrop
16143088887720661313 20180529131116 4 Overdrop
16143088887720746094 20180529131116 67 Overdrop
16143088887721402165 20180529131116 45 Overdrop
16143088887721439830 20180529131116 15 Overdrop
16143088887721639281 20180529131116 192 Overdrop
16143088887721647643 20180529131116 284 Overdrop
16143088887721690736 20180529131116 183 Overdrop
16143088887721701757 20180529131116 298 Overdrop
16143088887721727336 20180529131116 49 Overdrop
16143088935409947196 20180529131116 17 Overdrop

 

2. 이번주 테이블

CanisterId CreatedDtm CanisterBuildNum reason
16143087616092094861 20180604112643 4 Overdrop
16143088887720586765 20180604112643 17 Overdrop
16143088887720608063 20180604112643 17 Overdrop
16143088887720648072 20180604112643 59 Overdrop
16143088887720661313 20180604112643 4 Overdrop
16143088887721639281 20180604112643 192 Overdrop
16143088887721647643 20180604112643 284 Overdrop

 

3. 최종 원하는 테이블

CanisterId CreatedDtm CanisterBuildNum reason
16143087616091395733 20180529131116 58 Overdrop
16143087616092094861 20180604112643 4 Overdrop
16143088887720586765 20180604112643 17 Overdrop
16143088887720598318 20180529131116 208 Overdrop
16143088887720608063 20180604112643 17 Overdrop
16143088887720648072 20180604112643 59 Overdrop
16143088887720661313 20180604112643 4 Overdrop
16143088887720746094 20180529131116 67 Overdrop
16143088887721402165 20180529131116 45 Overdrop
16143088887721439830 20180529131116 15 Overdrop
16143088887721639281 20180604112643 192 Overdrop
16143088887721647643 20180604112643 284 Overdrop
16143088887721690736 20180529131116 183 Overdrop
16143088887721701757 20180529131116 298 Overdrop
16143088887721727336 20180529131116 49 Overdrop
16143088935409947196 20180529131116 17 Overdrop

 

매주 자료를 업데이트 하는데 지난주에도 있고 이번주에도 있으면 이번주 것으로 오버롸이트 하는 것이 주 입니다. 

 

감사합니다. 

by 갈매기 [2018.06.05 02:09:03]

지난주 값, [테이블 1] 이 존재합니다. [테이블 2]는 쿼리를 통해서 가지고 옵니다. 원하는 바는 매주 쿼리를 사용하여 [테이블 1]의 값을 원하는 값 [테이블 3]으로 업데이트 하는 것입니다. 

 

INSERT INTO [테이블 1]

Select *

from [테이블 2]

와 같이 사용하려고 했는데, PK 값이 중복되어 변경되지 않네요. 현재는 PK를 풀고 중복해서 사용하고 있습니다. 

하기와 같이 다시 쿼리로 테이블을 쓰고 있습니다. 

Select [CanisterId]
      ,[CreatedDtm]
      ,[CanisterBuildNum]
      ,[reasonEnglish], a.rownumber

FROM(SELECT [CanisterId]
      ,[CreatedDtm]
      ,[CanisterBuildNum]
      ,[reasonEnglish], ROW_number() over(Partition by canisterId order by createdDtm desc) rownumber
 FROM [ResearchDB].[dbo].[blackListCanister]
 ) a

 where rownumber =1

 order by canisterid

 

 


by 마농 [2018.06.05 08:58:09]

ID 는 항상 16개 고정인 것 같네요?
Insert 대신 ID 를 이용해 Update 를 해도 되구요.
새로운 ID가 들어올 가능성이 있다면? ID 를 이용해 Delete 후 Insert 해도 되겠네요.
 

UPDATE a
   SET a.CreatedDtm       = b.CreatedDtm
     , a.CanisterBuildNum = b.CanisterBuildNum
     , a.reasonEnglish    = b.reasonEnglish
  FROM ResearchDB.dbo.blackListCanister a  -- 지난주 테이블
 INNER JOIN
       (SELECT ...) b                      -- 이번주 쿼리
    ON a.canisterId = b.canisterId
;

 


by 쪼용 [2018.06.05 10:57:57]

MSSQL도 MERGE문이 있습니다

INSERT와 UPDATE가 동시에 진행이 되어야 한다면 MERGE문을 사용해보시는게 어떨지요??

https://docs.microsoft.com/ko-kr/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

마농님 말씀처럼 키가 고정값일 경우엔 UPDATE가 맞구요~


by 갈매기 [2018.06.05 22:21:40]

마농님 쪼용 님 감사합니다. 

 

ID는 16개로 고정은 아닙니다. 새로운 ID가 매주 들어올수 있습니다. ID를 이용해 delete후 insert하는 것에 대해 자세한 설명 부탁드려도 되나요? 


by 마농 [2018.06.07 08:37:40]
DELETE a
  FROM ResearchDB.dbo.blackListCanister a    -- 지난주 테이블
 INNER JOIN
       (SELECT ...) b                        -- 이번주 쿼리
    ON a.canisterId = b.canisterId
;
INSERT INTO ResearchDB.dbo.blackListCanister -- 지난주 테이블
SELECT * FROM (SELECT ...) b                 -- 이번주 쿼리
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입