2011-03-17 41 views
2

我有2个表具有相同的列 - T1,T2。我想根据键列更新T2中存在的列中的表T1列:如果键列存在,则从T2更新T1的其余列,如果不存在,则将整行从T2插入T1 。从一个表更新到另一个如果不存在于原始表中的SQL Server 2005中

这个查询没有做的工作:

IF EXISTS (SELECT keyC FROM T2 WHERE keyC in (select keyC from T1)) 
UPDATE T1 SET T1.c1 = T2.c1, 
T1.c2 = T2.c2, 
from T2 WHERE T2.keyC in (select keyC from T1) 
ELSE (INSERT INTO T1 select * from T2) 

不知道如何解决它?

由于提前,

格雷格

+0

您是否需要将此作为单条语句执行,因为它无法在一条语句中完成 – 2011-03-17 14:26:30

回答

3

由于您使用SQL Server 2005,因此无法使用合并a必须做两个陈述。一个更新和一个插入。

declare @T1 table (keyC int, c1 int) 
declare @T2 table (keyC int, c1 int) 

insert into @T1 values (1, 1) 

insert into @T2 values (1, 10) 
insert into @T2 values (2, 20) 

-- Update all rows 
update @T1 set 
    c1 = T2.c1 
from @T1 as T1 
    inner join @T2 as T2 
    on T1.keyC = T2.keyC 

-- Insert new rows 
insert into @T1 (keyC, c1) 
select keyC, c1 
from @T2 as T2 
where not exists (select * 
        from @T1 as T1 
        where T1.keyC = T2.keyC) 
1

对于SQL Server 2008,看看使用MERGE声明。

MERGE T1 AS target 
USING T2 AS source 
ON (target.keyC = source.keyC) 
WHEN MATCHED THEN 
    UPDATE SET c1 = source.c1, c2 = source.c2 
WHEN NOT MATCHED THEN 
    INSERT (keyC, c1, c2) 
    VALUES (source.keyC, source.c1, source.c2) 

编辑:OP变化问题2008至05年

对于早期版本,你需要2个操作:

UPDATE target 
    SET c1 = source.c1, c2 = source.c2 
    FROM T1 AS target 
     INNER JOIN T2 as source 
      ON target.keyC = source.keyC 

INSERT INTO T1 
    (keyC, c1, c2) 
    SELECT keyC, c1, c2 
     FROM T2 
     WHERE NOT EXISTS(SELECT NULL FROM T1 WHERE keyC = T2.keyC) 
+0

对不起,对此:)您的回答非常好!谢谢! – 2011-03-17 14:48:08

1

在SQL2008可以用优雅的MERGE语句:

MERGE T1 AS target 
USING T2 AS source ON (target.KeyC = source.KeyC) 
WHEN MATCHED THEN 
    UPDATE SET c1 = source.c1, 
       c2 = source.c2 
WHEN NOT MATCHED THEN 
    INSERT (c1, c2) 
    VALUES (source.c1, source.c2); 
相关问题