我有两个具有相同结构的表,这些表可以具有重复的记录,我想确定表1中已经存在表2中的哪些并将其从表2中删除。下面的SELECT返回要删除的重复记录。这些表都没有主键,因此我需要执行多个“ ON”来标识唯一记录。
SELECT V.*
FROM table2 AS V
INNER JOIN table1 AS N
ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3;
然后我将其作为DELETE的子查询插入:
DELETE FROM table2
WHERE table2.column1 IN
(SELECT V.*
FROM table2 AS V
INNER JOIN table1 AS N
ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3);
运行此查询时,出现以下错误:
您编写的查询可以返回多个字段,而无需在主查询的FROM子句中使用保留字EXISTS。更正子查询的SELECT指令以请求单个字段。
我也尝试过这种方法,但是它从表2中删除了[[所有记录,而不仅仅是子查询的结果:
DELETE FROM table2
WHERE EXISTS
(SELECT V.*
FROM table2 AS V
INNER JOIN table1 AS N
ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3);
这是我想到的第一个解决方案,但是我想知道,在MS Access中将不匹配的所有记录从table2插入到table1中,然后删除table2会不会更容易。所有的建议将不胜感激:)
DELETE
FROM table2 t2
WHERE EXISTS (SELECT 1 FROM table1 t1
WHERE t1.column1 = t2.column1 AND
t1.column2 = t2.column2 AND
t1.column3 = t2.column3);
您当前存在的尝试的问题是EXISTS
子句中的查询始终具有结果集,并且该结果集独立于外部delete调用。因此,所有记录都将被删除。
DELETE FROM table2
WHERE table2.column1 IN
(SELECT V.column1
FROM table2 AS V
INNER JOIN table1 AS N
ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3);