删除SQL数据库表中的多个条目。正确的查询?

时间:2013-11-02 16:55:55

标签: mysql sql oracle

我有下表:

-----------------
| Movie | Genre |
-----------------
| A     | Horror |
-----------------
| A     | Thiller |
-----------------
| B     | Comedy |
-----------------
| C     | Drama |
-----------------
| D     | Horror |
 ....

我想删除Movies的{​​{1}}。但我知道如果我只是说

Horror

这将是一个错误的查询,因为还有一部电影 - delete * where genre='Horror' - 因为它也是A

Thiller

但我想摆脱| A | Thiller |

我应该写什么查询? 我是SQL和关系数据库理论的新手,但我想我们应该首先考虑交叉产品或者加入或者使用该表。

DBMS:MySQL或Oracle。

2 个答案:

答案 0 :(得分:2)

delete from movies
where movie in (select movie
                from movies
                where genre = 'Horror');

以上查询适用于Oracle(以及Postgres和SQL Server以及DB2和Firebird以及H2和HSQLDB和...),但不适用于MySQL。

对于MySQL,需要将其重写为连接:

delete movies
from movies 
  join movies m2 on movies.movie = m2.movie
where m2.genre = 'Horror';

答案 1 :(得分:0)

MySQL在DELETE中有一个限制,即你无法加入或子查询你要删除的同一个表。但是如果你将所需的id包装在另一个子查询中,它将起作用:

DELETE FROM m 
USING movies m 
JOIN (
  SELECT Movie
  FROM movies
  WHERE Genre = 'Horror'
) m2: