2016-10-14 2 views
-1

중복 레코드가있는 테이블이 있습니다. 테이블 형식처럼이조건부 업데이트로 SQL Server에서 쿼리 병합

첫날 입력 테이블 이름-ABC

ani   cdate 
7076419812 2016-10-12 00:00:00.000 
9168919394 2016-10-12 00:00:00.000 
6282358407 2016-10-12 00:00:00.000 
9168834643 2016-10-12 00:00:00.000 

나는 것이 2016년 10월 12일 00 일에 대한 TS.But 독특한 MDN을 포함하는 다른 테이블에 삽입 할 : 00 : 00.000 같은 형식을 가진 다른 테이블에 쉽게 삽입 할 수 있습니다. 00 :

OUTPUT Table Name-- PQR 
MDN,   TS 
7076419812 2016-10-12 00:00:00.000 
9168919394 2016-10-12 00:00:00.000 
6282358407 2016-10-12 00:00:00.000 
9168834643 2016-10-12 00:00:00.000 

하지만 날짜 2016년 10월 13일 00

00.000 나는 같은 MDN 혼합 날짜의 같은 기록을하고 난 새로운 날짜 MDN 기존 업데이트 할 및 MDN이 새로 삽입해야 나머지 기록.

merge PQR as lc 
using (select ani, calldate from ABC ) as st 
on lc.mdn = st.ani 
WHEN MATCHED and lc.ts < st.calldate THEN 
update set lc.ts = st.calldate 
WHEN NOT MATCHED THEN 
insert (mdn,ts) values (st.ani, st.calldate); 
- :

ani   cdate 
7076419812 2016-10-13 00:00:00.000 
9168919394 2016-10-13 00:00:00.000 
6282358233 2016-10-12 00:00:00.000 
9168834609 2016-10-12 00:00:00.000 

출력이 제 일 입력 테이블의 처리 후이 같아야 같은 2 일째 입력 테이블 레코드 는

mdn   ts 
    7076419812 2016-10-13 00:00:00.000 
    9168919394 2016-10-13 00:00:00.000 
    6282358407 2016-10-12 00:00:00.000 
    9168834643 2016-10-12 00:00:00.000 
    6282358233 2016-10-12 00:00:00.000 
    9168834609 2016-10-12 00:00:00.000 

이것은 내 검색어가있다

+0

무엇이 문제입니까? –

+0

작동하지 않습니다. 최종 출력 테이블을 볼 수 있습니다 –

+0

미안 해요, 아마도 형식이지만 현재 출력과 무엇이 원하는 출력인지 알 수 없습니다. –

답변

0

댓글이 너무 길었지만 댓글을 달기에는 너무 길었습니다.

검색어가 정상적으로 표시되면 올바르게 반환되지 않는 항목에 대해 자세히 설명해야합니다. 다음은 동일한 논리를 사용하는 일부 테스트 데이터입니다 ...

if object_id ('tempdb..#PRQ') is not null drop table #PRQ 
create table #PRQ (mdn bigint, ts datetime) 

insert into #PRQ (mdn, ts) 
values 
(7076419812,'2016-10-12 00:00:00.000'), 
(9168919394,'2016-10-12 00:00:00.000'), 
(6282358407,'2016-10-12 00:00:00.000'), 
(9168834643,'2016-10-12 00:00:00.000') 



if object_id ('tempdb..#ABC') is not null drop table #ABC 
create table #ABC (ani bigint, cdate datetime) 

--this is simulating "day 2" where the date is changing for 7076419812 and 9168919394 

insert into #ABC (ani, cdate) 
values 
(7076419812,'2016-10-13 00:00:00.000'), --date change 
(9168919394,'2016-10-13 00:00:00.000'), --date change 
(6282358407,'2016-10-12 00:00:00.000'), 
(9168834643,'2016-10-12 00:00:00.000') 

--run the merge with the same logic you used 

MERGE #PRQ AS T 
USING(SELECT ani, cdate FROM #ABC) AS S 
ON T.mdn = s.ani 
WHEN MATCHED AND t.ts < s.cdate THEN 
UPDATE SET t.ts = s.cdate 
WHEN NOT MATCHED THEN 
INSERT (mdn,ts) VALUES (s.ani, s.cdate); 

--you will see the dates changed for 7076419812 and 9168919394 
SELECT * FROM #PRQ 

--Now we will update it for "day 3" 

update #ABC 
set cdate = '2016-10-14 00:00:00.000' 
where ani in (7076419812,9168919394) 

--run the same merge and select the results from #PRQ 

MERGE #PRQ AS T 
USING(SELECT ani, cdate FROM #ABC) AS S 
ON T.mdn = s.ani 
WHEN MATCHED AND t.ts < s.cdate THEN 
UPDATE SET t.ts = s.cdate 
WHEN NOT MATCHED THEN 
INSERT (mdn,ts) VALUES (s.ani, s.cdate); 

--see the date changes for 7076419812 and 9168919394 
SELECT * FROM #PRQ 

--now add two new records with two new ani to your ABC table 

insert into #ABC (ani, cdate) 
VALUES 
(5469358407,'2016-10-15 00:00:00.000'), 
(1234834643,'2016-10-15 00:00:00.000') 

--and now run the merge again, and see the added rows since they won't match 

MERGE #PRQ AS T 
USING(SELECT ani, cdate FROM #ABC) AS S 
ON T.mdn = s.ani 
WHEN MATCHED AND t.ts < s.cdate THEN 
UPDATE SET t.ts = s.cdate 
WHEN NOT MATCHED THEN 
INSERT (mdn,ts) VALUES (s.ani, s.cdate); 

SELECT * FROM #PRQ 
+0

한 번에 해보고 싶습니다. 수동으로하고 있습니다. MDN은 수천 가지가 될 수 있습니다. –

+0

병합은 "원 샷"에서 발생합니다. 예를 들어 임시 테이블을 수동으로 업데이트하는 중입니다 ... ABC가 일부 응용 프로그램, 트리거 등을 통해 업데이트되는 실제 테이블 인 경우 병합을 실행 한 작업을 실행할 때 대상 테이블 PRQ가 업데이트됩니다. . – scsimon

+0

@Ramdeoangh – scsimon