使用 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 JOIN
是 NOT EXISTS
和 EXCEPT
的穷人替代品,优化器理解得更好
- 您应该始终在
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;
关于这种防止重复插入的方法:
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 JOIN
是NOT EXISTS
和EXCEPT
的穷人替代品,优化器理解得更好- 您应该始终在
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;