如何利用匹配的临时表删除原数据表中的对应行?
解决Table1中匹配Table2行的删除问题
你的SQL语句执行失败的核心原因是不能直接用postid and userid in (...)这种写法——IN子查询要匹配多列时,要么把列作为一个整体行来比较,要么改用EXISTS子查询关联两个表的匹配条件。
下面给你几种可行的解决方案,你可以根据自己使用的数据库选择合适的写法:
方法1:使用EXISTS子查询(推荐,兼容性好)
这是最通用的写法,几乎所有关系型数据库都支持,逻辑也清晰:
DELETE FROM Table1 WHERE EXISTS ( SELECT 1 FROM Table2 WHERE Table2.postid = Table1.postid AND Table2.userid = Table1.userid )
它的逻辑是:检查Table1中的每一行,只要在Table2中找到postid和userid完全匹配的行,就删除这一行。
方法2:使用行构造器的IN子查询(适用于支持的数据库)
如果你的数据库支持行构造器(比如MySQL 8.0+、PostgreSQL、SQL Server 2016+等),可以直接把两个列作为一个整体来匹配:
DELETE FROM Table1 WHERE (postid, userid) IN ( SELECT postid, userid FROM Table2 )
注意这里要把postid和userid放在括号里作为一个行元素,而不是分开写postid and userid in (...)——这正是你原来语句的错误所在。
方法3:使用JOIN方式删除(部分数据库支持)
像MySQL这类数据库允许通过JOIN来定位要删除的行,写法如下:
DELETE t1 FROM Table1 t1 JOIN Table2 t2 ON t1.postid = t2.postid AND t1.userid = t2.userid
通过JOIN关联两个表的匹配行,然后直接删除Table1(别名t1)中的对应记录。
重要提醒
在执行DELETE之前,建议先把语句改成SELECT来验证要删除的行是否正确,避免误删数据:
SELECT * FROM Table1 WHERE EXISTS ( SELECT 1 FROM Table2 WHERE Table2.postid = Table1.postid AND Table2.userid = Table1.userid )
内容的提问来源于stack exchange,提问作者user5893513




