2011-03-17 43 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); 
相關問題