当主服务器可能有重复项时,如何仅将主表中的不同记录附加到另一个表。示例 - 我只想在较小的表中使用不同的记录,但我需要将记录插入/附加到较小的表中已有的记录。
答案 0 :(得分:2)
忽略任何并发问题:
insert into smaller (field, ... )
select distinct field, ... from bigger
except
select field, ... from smaller;
您还可以将其改为连接:
insert into smaller (field, ... )
select distinct b.field, ...
from bigger b
left join smaller s on s.key = b.key
where s.key is NULL
答案 1 :(得分:1)
如果您不喜欢NOT EXISTS
和EXCEPT
/ MINUS
(可爱,Remus!),您还有LEFT JOIN
解决方案:
INSERT INTO smaller(a,b)
SELECT DISTINCT master.a, master.b FROM master
LEFT JOIN smaller ON smaller.a=master.a AND smaller.b=master.b
WHERE smaller.pkey IS NULL
答案 2 :(得分:1)
你没有说问题的规模所以我会提到我最近帮助过朋友的事情。
他在一家保险公司工作,该公司为其他保险公司提供补充牙科和远景福利管理。当他们获得一个新的客户端时,他们也会获得一个可以拥有数百万条记录的新数据库。他们想要在拥有100万条记录的主数据库中识别所有可能存在的数据。
我们提出的解决方案是识别两个不同的字段值组合(以各种方式标准化),这些组合表明欺骗的概率很高。然后,我们创建了一个新表,其中包含组合的MD5哈希值以及它们应用于的主记录的ID。 MD5列已编入索引。所有新记录都将计算其组合哈希值,如果其中任何一个与主人发生冲突,则新记录将被踢出到异常文件中供某人处理。
这种速度让我们感到惊讶(以一种不错的方式)并且它具有非常可接受的假阳性率。
答案 3 :(得分:0)
您可以使用distinct
关键字过滤重复项:
insert into AnotherTable
(col1, col2, col3)
select distinct col1, col2, col3
from MasterTable
答案 4 :(得分:0)
基于Microsoft SQL Server及其Transact-SQL。一如既往地未经测试,target_table与源表具有相同的行数(否则使用INSERT INTO
和SELECT
之间的列名
INSERT INTO target_table
SELECT DISTINCT row1, row2
FROM source_table
WHERE NOT EXISTS(
SELECT row1, row2
FROM target_table)
答案 5 :(得分:0)
这样的东西适用于SQL Server(你没有提到你正在使用的RDBMS):
INSERT INTO table (col1, col2, col3)
SELECT DISTINCT t2.a, t2.b, t2.c
FROM table2 AS t2
WHERE NOT EXISTS (
SELECT 1
FROM table
WHERE table.col1 = t2.a AND table.col2 = t2.b AND table.col3 = t2.c
)
在适当的时候调整,具体取决于为您的表定义“清晰度”的确切内容。