2011-09-04 142 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

感謝卡米爾的解釋。 –