如何从一个表中删除与另一表匹配的行?

Posted

技术标签:

【中文标题】如何从一个表中删除与另一表匹配的行?【英文标题】:How to delete rows from one table matching another table? 【发布时间】:2018-03-18 20:33:06 【问题描述】:

我正在尝试从一个表中删除行。所以这就是我到目前为止所做的。我导入了一个创建临时表的 .CSV 文件。我想删除原始表中与临时表匹配的行。

我尝试了以下代码:

Delete From Table1 
Where postid and userid in (Select postid, userid 
                            from Table2)

但它不起作用。

目标是使用表 2 删除表 1 中的行。

【问题讨论】:

【参考方案1】:

一个简单的INNER JOIN 就可以完成这项工作:

DELETE T1
FROM Table1 T1
INNER JOIN Table2 T2
ON T1.postid = T2.postid
AND T1.userid = T2.userid

【讨论】:

【参考方案2】:

这只是另一种有趣的方式:

DELETE FROM Table1 
WHERE STR(postid) + STR(userid) 
IN (SELECT STR(postid) + STR(userid) FROM Table2)

【讨论】:

如果 postiduserid 是 GUID,这在 sql server 中不起作用。不过方法不错。【参考方案3】:

据我了解,您想从 Table1 中删除,您想从 Table2 中创建基于 postid 和 userid 的复合条件,问题是您在 (Select postid,userid from 表 2) 没有返回正确的值以匹配 in 条件,请将查询修改为

DELETE T1
FROM Table1 T1
INNER JOIN Table2 T2
ON T1.postid = T2.postid
AND T1.userid = T2.userid

如上一个答案所述

【讨论】:

【参考方案4】:

您可以使用 Merge 语句。在这种情况下,您只对删除感兴趣。在删除部分之后需要一个分号,然后是最后一个分号以结束合并语句。例如:

MERGE table1 AS target USING table2 AS source
ON target.postid = source.postid and target.userid = source.userid
WHEN Matched THEN DELETE;;

一个例子 sqlfiddle:http://sqlfiddle.com/#!18/a932d/1/0

合并文档:https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

【讨论】:

以上是关于如何从一个表中删除与另一表匹配的行?的主要内容,如果未能解决你的问题,请参考以下文章

将三行与另一表中的一行连接起来

从一个表返回与另一表不匹配的单行

如何从一个表中获取另一表中不存在的行

删除一张表中与另一张表中相同的记录

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

UNION JOIN 连接表