簡體   English   中英

重新編寫查詢以從選擇語句中刪除

[英]Re-writing my query to delete from a select statement

這是我的查詢,理論上是我想要的,但是我知道MySQL不允許您在子選擇中使用與刪除相同的表:

DELETE FROM manifestPallet WHERE palletID IN 
( SELECT  manifestPallet.palletID 
            FROM manifestPallet
            LEFT JOIN manifestBox
            ON manifestPallet.palletID = manifestBox.palletID
            WHERE manifestBox.palletID IS NULL)

我知道我可以先進行選擇,然后遍歷我的php腳本中的結果並刪除查詢,但是我認為使用純MySQL可能是更優雅的解決方案。

額外信息:查詢的作用是從清單中刪除空的托盤。 用戶創建貨盤,然后在其上放置盒子,如果他們創建貨盤,但未在其上放置任何盒子,則在清單關閉時需要將貨盤取下。

DELETE manifestPallet
FROM   manifestPallet LEFT JOIN manifestBox USING (palletID)
WHERE  manifestBox.palletID IS NULL

您只需要指定在哪些表上應用DELETE。

僅刪除manifestPallet行:

DELETE `manifestPallet` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

刪除manifestPallet和manifestBox行:

DELETE `manifestPallet`, `manifestBox` FROM `manifestPallet` LEFT JOIN `manifestBox` ....

僅刪除manifestBox行:

DELETE `manifestBox` FROM `manifestPallet` LEFT JOIN `manifestBox` ....
DELETE FROM manifestPallet mp
WHERE NOT EXISTS (
    SELECT *
    FROM manifestBox mbx
    WHERE mp.palletID = mbx.palletID
    );

注意:與原始查詢在語義上有所不同,因為IN( subselect)詞刪除了NULL(和重復項)。 這可能不會在實際結果中引起差異,因為palletID可能是一個不可為空的(主)鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM