删除带有MS Access中2个表的子查询的重复项

问题描述 投票:0回答:1

我有两个具有相同结构的表,这些表可以具有重复的记录,我想确定表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会不会更容易。

所有的建议将不胜感激:)

sql ms-access subquery sql-delete ms-access-2016
1个回答
0
投票
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调用。因此,所有记录都将被删除。


0
投票
这应该会更好:

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);

© www.soinside.com 2019 - 2024. All rights reserved.