2014-04-22 35 views
0

下面是我的查詢,理論上這是我想要的,但我知道MySQL不會讓您在子選擇中使用與刪除中相同的表:重寫我的查詢以從select語句中刪除

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的一個更好的解決方案。

附加信息: 查詢所做的是從空清單中刪除貨盤。用戶創建托盤,然後在其上放置箱子,如果他們創建托盤但不放置任何箱子,則在清單關閉時需要移除托盤。

+0

可能重複[MySQL Error 1093](http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-in-from-from-條款) – bsoist

回答

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

這工作!我有一種感覺,我過度思考我的問題,雖然我沒有關於使用關鍵字USING –

+0

@ S.Mason的經驗:'a JOIN b USING(col1,col2)'只是簡寫'a JOIN b ON a.col1 = b.col1 AND a.col2 = b.col2'。唯一的區別是,在執行SELECT *時,結果集僅包含每個「col1」和「col2」中的一列。 – eggyal

0

您只需指定應用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` .... 
0
DELETE FROM manifestPallet mp 
WHERE NOT EXISTS (
    SELECT * 
    FROM manifestBox mbx 
    WHERE mp.palletID = mbx.palletID 
    ); 

注意:是一個由於IN(subselect)術語刪除NULL(和重複),因此與原始查詢的語義差異。 由於palletID可能是一個NOT NULLable(主鍵)鍵,所以這可能不會導致實際結果的差異。