SQL删除基于另一个表的行

ned*_*orf 30 mysql sql

这可能很容易,但是周一早上.我有两张桌子:

表格1:

Field        | Type             | Null | Key | Default | Extra
id           | int(32) unsigned | NO   | PRI | NULL    | auto_increment
group        | int(32)          | NO   |     | 0       |                
Run Code Online (Sandbox Code Playgroud)

表2:

Field     | Type             | Null | Key | Default | Extra
group     | int(32)          | NO   |     | 0       | 
Run Code Online (Sandbox Code Playgroud)

忽略其他字段...我想要一个SQL DELETE语句,它将删除Table1中存在等于Table1.group的Table2.group的所有行.因此,如果Table1的一行具有group = 69,那么当且仅当Table2中存在group = 69的行时才应该删除该行.

感谢您的任何帮助.

Jay*_*Jay 39

我想这就是你想要的:

DELETE FROM `table1`
WHERE `group` in (SELECT DISTINCT `group` FROM `table2`)
Run Code Online (Sandbox Code Playgroud)

  • 这确实是一个解决方案,但肯定不是唯一的解决方案,而且最明确的不是表现最好的解决方案.在非常大的表格上,必须始终谨慎使用"IN"运算符.更好的解决方案是@ BT26提供的使用内连接的解决方案. (6认同)
  • 正如@kuklei所说,这是非常耗费资源的,尽管它有效,但除了小桌子外,它基本上无法使用.我们有一个1.3米行的表,甚至将其限制为删除500,准备查询需要5分钟以上.以下BT26的答案是正确的答案. (3认同)

小智 19

我觉得这种方式更快:

DELETE FROM t1 USING table1 t1 INNER JOIN table2 t2 ON ( t1.group = t2.group );
Run Code Online (Sandbox Code Playgroud)

  • 在SQL Server的情况下,语法为:DELETE FROM t1**FROM t1**INNER JOIN T2 ON t1.ID = t2.ID这将根据id删除表t2上存在的t1中的所有行,但更多条件可以是通常使用AND运算符添加到内部联接子句中.请注意第二个From?!它没有错误,这就是使USING在SQL Server上工作的原因. (4认同)

小智 8

好的解决方案就是编写SQL,就像你自己说的那样:

DELETE FROM Table1
WHERE
  EXISTS(SELECT 1 FROM Table2 WHERE Table2.Group = Table1.Group)
Run Code Online (Sandbox Code Playgroud)

此致,Arno Brinkman


u07*_*7ch 7

像这样的东西

delete from table1 where group in (select group from table2)
Run Code Online (Sandbox Code Playgroud)