使用 LEFT JOIN 插入 SELECT 以防止重复,仅防止 table 中已有的重复

INSERT INTO SELECT with a LEFT JOIN to prevent duplicates, only prevents duplicates already in the table

关于这种防止重复插入的方法:

INSERT INTO table1 
SELECT t2.col1, 
       t2.col2 
FROM   table2 t2 
       LEFT JOIN table1 t1 
         ON t2.col1 = t1.col1 
            AND t2.col2 = t1.col2 
WHERE  t1.col1 IS NULL 

根据我的测试,我可以看到这将阻止来自 Table_2 的任何重复 col1/col2 组合已经存在于 Table_1,但它不会阻止相同的 col1/col2 组合从 Table_2 传入不止一次。我是否认为 LEFT JOIN 中对 Table_1 的引用可以被认为是查询开始之前的 Table_1 的 'snapshot',因此它没有任何作为查询本身的一部分从 Table_2 添加的新 col1/col2 组合的可见性?

如果这是正确的,并且有没有一种方法可以检查传入源中的重复项 table 以及无需采取额外步骤进行源重复数据删除(在我的真实世界中,源将是两个 tables INNER JOINed)?

谢谢

您在“快照”点上是正确的:在此查询中对 table1 的任何插入都不会影响 LEFT JOIN table1.

但是您仍然需要 DISTINCT 来保证查询数据的唯一性。

INSERT INTO table1 
SELECT DISTINCT
       t2.col1, 
       t2.col2 
FROM   table2 t2 
       LEFT JOIN table1 t1 
         ON t2.col1 = t1.col1 
            AND t2.col2 = t1.col2 
WHERE  t1.col1 IS NULL 

但是:

  • LEFT JOINNOT EXISTSEXCEPT 的穷人替代品,优化器理解得更好
  • 您应该始终在 INSERT
  • 中指定列名

所以您的代码应该类似于以下选项之一:

INSERT INTO table1 (col1, col2)
SELECT DISTINCT
       t2.col1, 
       t2.col2 
FROM   table2 t2 
WHERE NOT EXISTS (SELECT 1
       FROM table1 t1 
         WHERE t2.col1 = t1.col1 
            AND t2.col2 = t1.col2);



INSERT INTO table1 (col1, col2)
SELECT DISTINCT
       t2.col1, 
       t2.col2 
FROM   table2 t2 
WHERE NOT EXISTS (                    -- or you can use EXISTS/EXCEPT
       SELECT t2.col1, t2.col2
       INTERSECT
       SELECT t1.col1, t1.col2
       FROM table1 t1);



INSERT INTO table1 (col1, col2)
SELECT                  -- EXCEPT implies DISTINCT
       t2.col1, 
       t2.col2 
FROM   table2 t2
EXCEPT
SELECT t1.col1, t1.col2
FROM table1 t1;