如何将数据导入空 SQL 服务器 table 避免源数据重复

How to import data to an empty SQL server table avoiding duplicates in the source data

我正在尝试将数据导入空 SQL 服务器 table,避免源数据中存在重复项。

目前我正在对临时文件进行批量插入 table,然后使用以下方法复制数据:

INSERT INTO Actual_table
SELECT * FROM Temp_table

所以Temp_table和Actual_table的结构完全一样,唯一不同的是Actual_table的PK场,我设置了Temp_table 使用唯一标识符,并将其设置为忽略重复项:

UNIQUE NONCLUSTERED (Col1) WITH (IGNORE_DUP_KEY = ON) 

换句话说:

Actual_table

Col1 (PK)    Col2

Temp_table

Col1 (Unique, ignore duplicates)   Col2

我们开始这个过程时Actual_table是空的,要避免的重复只是在PK字段上(不是整行DISTINCT,换句话说)。

我不知道这是否是实现此目标的最佳方法,comments/suggestions 将不胜感激。

进一步充实我的想法:

  1. 我是否应该直接导入实际的 table,在导入之前添加 IGNORE_DUP_KEY 约束,然后删除它(这甚至可能)?
  2. 难道我没有设置 Temp_table 和 IGNORE_DUP_KEY 约束(这使得批量导入更快),然后调整跨代码复制以忽略重复项?如果这是个好主意,有人能告诉我实现这个的语法吗?

我正在使用 SQL 服务器 2014。

如果 table 最初是空的,那么您只需在加载时删除重复项:

INSERT INTO Actual_table
    SELECT DISTINCT *
    FROM Temp_table;

如果您只想 "distinctness" 列的子集,请使用 row_Number():

INSERT INTO Actual_table
    SELECT <col1>, <col2>, . . .
    FROM (SELECT t.*,
                 ROW_NUMBER() OVER (PARTITION BY col ORDER BY (SELECT NULL)) as seqnum
          FROM Temp_table t
         ) t
    WHERE seqnum = 1;