обновление из одной таблицы в другую, если она не существует в исходной таблице в SQL Server 2005 - PullRequest
2 голосов
/ 17 марта 2011

У меня есть 2 таблицы с одинаковыми столбцами - T1, T2.Я хочу обновить столбцы таблицы T1 из столбцов, которые существуют в T2, на основе ключевого столбца: если ключевой столбец существует, то обновить остальные столбцы T1 из T2, если его нет, затем вставить всю строку от T2 до T1.

Этот запрос не выполняет работу:

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)

Есть идеи, как это исправить?

Заранее спасибо,

Грег

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Поскольку вы используете SQL Server 2005, вы не можете использовать слияние и должны сделать два оператора.Одно обновление и одна вставка.

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 голос
/ 17 марта 2011

В 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);
1 голос
/ 17 марта 2011

Для 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)

РЕДАКТИРОВАТЬ : ОП изменил вопрос с 2008 на 2005

Для более ранних версий вам нужно 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)
...