2014-07-24 43 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删除(如果需要).. –