2011-09-04 203 views
9

我有以下MySQL查询:MySQL的删除与嵌套select查询

DELETE FROM catalogue 
WHERE catalogue_id IN (
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
) 
) 

但是,当我尝试执行我收到以下错误信息:

您不能指定目标表'目录'在FROM子句中更新

有人能告诉我哪里出错了吗?

回答

13

执行双重嵌套

DELETE FROM catalogue 
WHERE catalogue_id IN (SELECT catalogue_id FROM (
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
)) x 
) 

它可以愚弄的MySQL

+0

完美工作zerkms,但是'愚弄'MySQL的原因是什么? –

+0

如果你有多个“WHERE”列,那么怎么办?即'DELETE FROM catalog WHERE catalogue_id AND catalogue_name IN ...' – ThreaT

+0

@ThreaT:我不确定你在问什么。多个谓词可以用ADD来添加,是的。 – zerkms

4

或者您可以使用临时表:

CREATE TEMPORARY TABLE t AS 
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
); 

    DELETE FROM catalogue WHERE catalogue_id IN (SELECT catalogue_id FROM t); 

与您的查询你有You can't specify target table 'catalogue' for update in FROM clause,因为你不能使选择和更新在一个查询中的同一张桌子上。

+0

感谢卡米尔的解释。 –