SQL删除基于另一个表的行

时间:2009-11-23 15:20:27

标签: sql mysql

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

表1:

Field        | Type             | Null | Key | Default | Extra
id           | int(32) unsigned | NO   | PRI | NULL    | auto_increment
group        | int(32)          | NO   |     | 0       |                

表2:

Field     | Type             | Null | Key | Default | Extra
group     | int(32)          | NO   |     | 0       | 

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

感谢您的帮助。

6 个答案:

答案 0 :(得分:37)

我认为这就是你想要的:

DELETE FROM `table1`
WHERE `group` in (SELECT DISTINCT `group` FROM `table2`)

答案 1 :(得分:18)

我认为这种方式更快:

DELETE FROM t1 USING table1 t1 INNER JOIN table2 t2 ON ( t1.group = t2.group );

答案 2 :(得分:8)

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

DELETE FROM Table1
WHERE
  EXISTS(SELECT 1 FROM Table2 WHERE Table2.Group = Table1.Group)

此致 阿诺布林克曼

答案 3 :(得分:7)

像这样的东西

delete from table1 where group in (select group from table2)

答案 4 :(得分:1)

脱离我的头顶:

delete from Table1 where id in (select id from table1 inner join table2 on Table1.group = Table2.group)

我的做法与其他海报略有不同 - 我认为如果Table2上有大量行,这可能会更好。有人可以直截了当地指出我吗?

答案 5 :(得分:0)

您可以在简单的联接查询中使用其别名来删除任一表行

delete a from table1 a,table2 b where a.uid=b.id and b.id=57;

在这里,您可以指定a或b删除相应的表行