【问题标题】:How do i avoid duplicate record inserting in target table when source table not having foreign key constraint当源表没有外键约束时,如何避免在目标表中插入重复记录
【发布时间】:2015-09-10 19:44:16
【问题描述】:

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

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 中已存在的行。

示例:不应将源表 B 的第一条记录插入表 A。

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

我们怎样才能巧妙地处理这种情况?请提出建议。

【问题讨论】:

  • 为什么不加外键呢?听起来您无论如何都想强制执行它,那么为什么不将它添加到您的系统中呢?这就是它们存在的原因。

标签: sql sql-server


【解决方案1】:
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)

【讨论】:

    【解决方案2】:
    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中的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多