当源表没有外键约束时,如何避免在目标表中插入重复记录

时间:2015-09-10 19:44:16

标签: sql sql-server

我们通常可以通过映射和检查条件使用合并查询/连接查询来避免重复插入目标表。但是如何在没有外键约束的情况下处理以避免重复插入。

TableA - 目标表

+--------+--------+-----------+-----------+------------+
|  Id    | RecNo  |   Name    |   Salary  |  Date      |
+--------+--------+-----------+-----------+------------+
|anyGuid |Guid1   | Name1     |  10000    | 19-07-2015 |
|anyGuid |Guid2   | Name2     |  20000    | 20-07-2015 |
|anyGuid |Guid3   | Name3     |  30000    | 19-07-2015 |
+--------+--------+-----------+-----------+------------+

TableB - 源临时表

+--------+--------+-----------+------------+
| RecNo  | Name   | Salary    | Date       |
+--------+--------+-----------+------------+
|Guid3   |Name3   | 30000     | 19-07-2015 |
|Guid4   |Name4   | 40000     | 20-07-2015 |
|Guid5   |Name5   | 40000     | 21-07-2105 |
+--------+--------+-----------+------------+

现在,我需要将TableB中的所有行插入到TableA目标表中,但不应插入TableA中已存在的行。

示例:不应将源TableB的第一条记录插入TableA。

注意: TableA和TableB之间没有外键。

我们如何巧妙地处理这个案子?建议请。

2 个答案:

答案 0 :(得分:0)

INSERT INTO TableA (ID, RecNo, Salary, [Date])
SELECT  RecNo, Name, Salary, [Date]
FROM TableB B 
WHERE NOT EXISTS (SELECT 1 
                  FROM TableA 
                  WHERE B.Name = RecNo)

答案 1 :(得分:0)

INSERT INTO TableA (RecNo, Name, Salary, Date)
SELECT b.RecNo, b.Name, b.Salary, d.Date
FROM TableB b
LEFT OUTER JOIN TableA a ON a.RecNo = b.RecNo
WHERE a.RecNo IS NULL

这假设RecNo提供唯一性。左外连接将匹配两个表之间具有相同RecNo的记录,where条件(a.RecNo IS NULL)将查找TableB中不存在于TableA中的记录。