T-SQL для каждой альтернативы? - PullRequest
7 голосов
/ 09 июня 2010

Мне нужно взять данные из одной таблицы и импортировать их в другую таблицу.В псевдокоде что-то вроде этого:

For Each row in table1
If row.personid is in table2 then
   update table2.row
Else
   insert row into table2
End If
Next

Каков наилучший способ сделать это в T-SQL?Насколько я понимаю, T-SQL не поддерживает For Each..Next, так что у меня есть альтернативы?

Ответы [ 7 ]

9 голосов
/ 09 июня 2010

Если вы используете SQL Server 2008, вы можете использовать оператор MERGE.Может быть, что-то вроде этого:

MERGE table2 AS t  -- target
USING table1 AS s  -- source
    ON ( t.personid = s.personid )
WHEN MATCHED THEN 
    UPDATE
    SET second_column = s.second_column,
        third_column = s.third_column,
        etc = s.etc
WHEN NOT MATCHED THEN    
    INSERT ( personid, second_column, third_column, etc )
    VALUES ( s.personid, s.second_column, s.third_column, s.etc )
7 голосов
/ 09 июня 2010

При прочих равных, операции на основе множеств лучше.

update t1
set t1.x = t2.x
.
.
.
from table1 t1
inner join table2 t2 on t1.id = t2.t1id

then

insert into table1
select * from table2 t2 where t2.t1id not in (select table1.id from table1 )
4 голосов
/ 09 июня 2010

Если вы используете SQL Server 2008, то лучший способ сделать это с помощью оператора MERGE. Что-то вроде ...

MERGE INTO target_table t
USING source_table s
ON t.personid = s.personid
WHEN MATCHED THEN
    UPDATE ...
WHEN NOT MATCHED THEN
    INSERT ...
4 голосов
/ 09 июня 2010

делать это в цикле while просто неправильно.
для вашей ситуации вы можете использовать новую инструкцию MERGE в SQL Server 2008.
Вот простой пример о том, как это сделать.

4 голосов
/ 09 июня 2010

Вы можете использовать курсор для этого, как уже описывали другие. Лично мне нравится делать два утверждения подряд примерно так:

UPDATE tbl2 SET field1=tbl1.field1, field2=tbl1.field2 -- etc.
FROM tb12
JOIN tbl1 on tbl2.personid = tbl1.personid

INSERT tbl2 (personid, field1, field2)
SELECT personid, field1, field2 
FROM tbl1
WHERE NOT EXISTS (select personid from tbl2 where personid = tbl1.persondid)
3 голосов
/ 09 июня 2010

Вы указали TSQL, но не указали версию.Если вы используете SQL2008, оператор Merge должен делать то, что вам нужно.

0 голосов
/ 09 июня 2010

Одним из наиболее распространенных способов является использование курсоров. Таким образом, вы можете просмотреть каждую запись, возвращаемую вашим запросом, и обработать ее соответствующим образом, с помощью UPDATE или INSERT.

См .: http://msdn.microsoft.com/en-us/library/ms180169.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...