2011-05-21 88 views
1

我正在连接两个数据库进行数据迁移。我想检查第二个数据库中是否存在第一个数据库表中的记录。如何在SQL Server 2005中编写INSERT IF NOT EXISTS查询

I.e.从源数据库用户表我希望将数据迁移到目标数据库用户表。

如何使用if not exists来编写查询?

+0

哪个版本的标准SQL? “合并”是标准SQL,但不受所有RDBMss – 2011-05-21 10:51:03

回答

2

SQL2003定义MERGE,否则你可以做一个INSERT INTO ... SELECT并在SELECT你应该LEFT JOIN使用在ON谓语自然键的目标表,然后就在WHERE <column> IS NULL卡盘。

+0

+1的支持,但看起来像现在编辑的问题是指SQL Server 2005而不是“标准SQL” – 2011-05-21 10:56:56

+0

SQL Server 2005没有MERGE命令。 ... – 2011-05-21 12:10:20

+0

我的答案不是特定于SQL Server的。 – 2011-05-22 00:47:12

4
insert into myTable 
select * from myOldTable ot 
where NOT EXISTS (select 1 from mytable t where t.ID = ot.ID) 

您可能会更好写它作为加入

insert into myTable 
select ot.* 
from myOldTable ot 
LEFT JOIN mtTable t 
ON ot.ID = t.ID 
WHERE t.ID IS NULL 

,或者根据您的数据库,合并可能会更好,有很多的选择

+0

这两种情况都存在竞争条件的可能性,因此OP需要一个唯一的约束或额外的锁定提示。 – 2011-05-21 10:57:29

+0

@Martin,你说得对,加上WITH(SERIALIZABLE,UPDLOCK)'应该可以解决这个问题,我相信 – 2011-05-21 11:02:58

+0

其实刚刚注意到Andomar的观点,即这是为了数据迁移,所以OP可能不需要担心这一点。 – 2011-05-21 11:05:05

3

我发现下面的语法简单阅读:

insert TargetTable 
     (col1, col2) 
from SourceTable as source 
where not exists 
     (
     select * 
     from TargetTable as duplicate 
     where source.col1 = duplicate.col1 
       and source.col2 = duplicate.col2 
     ) 

通常,您不必担心数据迁移过程中的并发性。如果这样做,您可以指定锁定提示,如with (tablock)或更高transaction isolation level。或者,您可以按照建议使用merge,但这有一个相当复杂的语法。

+0

谢谢andomar..this是我搜索的.. – ammu 2011-05-22 06:10:32

0
select * from db1.schema1.table1 
intersect 
select * from db2.schema2.table2 
+1

以及如何和在哪里**插入**新行??? – 2011-05-21 12:10:47