2014-07-24 49 views
0

我有兩個表t和t1。 問題: 如果#t1中沒有數據可用,那麼我需要插入數據,如果數據可用,那麼我需要更新。假設如果我從#t的#t1的終止日期列第一次空白,那麼我需要插入,如果我得到具有相同的ID相同的活動日期的數據,然後我需要更新#t1終止日期列中的日期,我不應該在表中有第二項。我如何處理它。SQL Server查詢幫助更新行而不是插入

CREATE TABLE #t (
id INT 
,activedate VARCHAR(15) 
,terminationdate VARCHAR(20) 
) 

CREATE TABLE #t1 (
id INT 
,activedate VARCHAR(15) 
,terminationdate VARCHAR(20) 
) 

INSERT INTO #t 
VALUES (
1 
,'2006-01-01' 
,NULL 
) 
,(
1 
,'2006-01-01' 
,'2006-01-31' 
) 

SELECT * 
FROM #t 

SELECT * 
FROM #t1 

MERGE INTO #t1 ds 
USING (
SELECT DISTINCT * 
FROM #t 
) al 
ON ds.id = al.id 
    AND ds.activedate = al.activedate 
    AND ds.terminationdate = al.terminationdate 
WHEN NOT MATCHED 
THEN 
    INSERT (
     id 
     ,activedate 
     ,terminationdate 
     ) 
    VALUES (
     id 
     ,activedate 
     ,terminationdate 
     ) 
WHEN MATCHED 
AND ds.terminationdate = '' 
THEN 
    DELETE 
WHEN MATCHED 
AND ds.id = al.id 
AND ds.activedate = al.activedate 
THEN 
    UPDATE 
    SET ds.terminationdate = al.terminationdate; 

進出料放:

第一次

id activedate terminationdate 
1 2006-01-01 null  

,如果我得到terminationdate(假設2006- 8-30)具有相同的有效日期forsame ID,然後記錄需要更新,而不是2次記錄條目

id activedate terminationdate  
1 2006-01 - 01 2006 - 8 - 30 

注: 如果我們可以通過改變th e上面的查詢將是非常好的,否則共享替代方法來實現它。

回答

1

這種情況正是MERGE command的設計目的。一個例子是:

MERGE dbo.Table1 
USING dbo.Source ON Source.Key = Table1.Key 

WHEN MATCHED THEN UPDATE SET Data1=Source.Data1, Data2=Source.Data2 

WHEN NOT MATCHED BY TARGET THEN INSERT 
VALUES(Source.Key, Source.Data1, Source.Date2) 

WHEN NOT MATCHED BY SOURCE THEN DELETE 

OUTPUT $Action, isnull(Source.Key,Table1.Key), 
    deleted.Data1,deleted.Data2, 
    inserted.Data1,inserted.Data2; 
+0

在合併中,我們可以刪除記錄,如果只匹配。 – Prasad

+0

@Prasad:不,根據源代碼不匹配的記錄也可以使用SQL SERVER 2008 R2刪除(如果需要).. –