复杂的删除条件

DELECT 语句中的 WHERE 子句可与 SELECT 语句中的一样复杂。它可包含通过 AND 和 OR 连接的多个条件,且它可能包含子查询。

假设您发现 stock 表的某些行包含不正确的制造商代码。您不想更新它们,而是想要删除它们以便重新输入它们。您知道,与正确的那些行不一样,这些行在 manufact 表中没有相匹配的行。由于这些不正确的行在 manufact 表中没有相匹配的行,因此您可以编写下例中所示的 DELETE 语句:
DELETE FROM stock
          WHERE 0 = (SELECT COUNT(*) FROM manufact
          WHERE manufact.manu_code = stock.manu_code);
该子查询对匹配的 manufact 行数进行计数;对 stock 的正确的行计数为 1,对不正确的行计数为 0。选取不正确的行来删除。
提示: 使用复杂的条件来开发 DELETE 语句的一种方法是,先开发精确地返回要删除的行的 SELECT 语句。将它编写为 SELECT *;当它返回所期望的行集时,将 SELECT * 更改为读取 DELETE,并再执行它一次。

DELETE 语句的 WHERE 子句不可使用测试同一表的子查询。即,当您从 stock 进行删除时,您不可在也从 stock 中选择的 WHERE 子句中使用子查询。

此规则的关键在于 FROM 子句。如果在 DELETE 语句的 FROM 子句中命名表,则该表不可还出现在 DELECT 语句的子查询的 FROM 子句中。