如何将不同记录从一个表追加到另一个表

时间:2009-12-21 19:47:03

标签: sql insert distinct

当主服务器可能有重复项时,如何仅将主表中的不同记录附加到另一个表。示例 - 我只想在较小的表中使用不同的记录,但我需要将记录插入/附加到较小的表中已有的记录。

6 个答案:

答案 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 EXISTSEXCEPT / 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 INTOSELECT之间的列名

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
       )

在适当的时候调整,具体取决于为您的表定义“清晰度”的确切内容。