如何将数据导入空 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 将不胜感激。
进一步充实我的想法:
- 我是否应该直接导入实际的 table,在导入之前添加 IGNORE_DUP_KEY 约束,然后删除它(这甚至可能)?
- 难道我没有设置 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;
我正在尝试将数据导入空 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 将不胜感激。
进一步充实我的想法:
- 我是否应该直接导入实际的 table,在导入之前添加 IGNORE_DUP_KEY 约束,然后删除它(这甚至可能)?
- 难道我没有设置 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;