3

我有下表:

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

我想删除Movies那些Horror。但我知道,如果我简单地说

delete * where genre='Horror'

这将是一个错误的查询,因为剩下 1 部电影A- 因为它也是Thiller.

| A     | Thiller |

但我想摆脱A.

我应该写什么查询? 我是 SQL 和关系数据库理论的新手,但我想也许我们应该首先采用该表的交叉产品或连接或 smth。

DBMS:MySQL 或 Oracle。

4

2 回答 2

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';
于 2013-11-02T16:59:41.620 回答
0

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

DELETE FROM m 
USING movies m 
JOIN (
  SELECT Movie
  FROM movies
  WHERE Genre = 'Horror'
) m2:
于 2013-11-02T20:31:17.683 回答