2010-11-11 57 views
30

我試圖根據另一個數據庫的選擇標準從一個數據庫中刪除記錄。我們有兩個表格,emailNotification存儲作業和電子郵件列表。然後我們有工作。我想清除已關閉的作業的電子郵件通知。我在Stackoverflow上發現了一些前面的例子,這些例子將我引向這種類型的語法(我以前試圖在之前嘗試進行連接)。從加入的一張表中刪除

DELETE FROM emailNotification 
WHERE notificationId IN (
SELECT notificationId FROM emailNotification e 
LEFT JOIN jobs j ON j.jobId = e.jobId 
WHERE j.active = 1 
) 

我收到錯誤,您無法在FROM子句中指定目標表'emailNotication'進行更新。

+0

來自http://dev.mysql.com/doc/refman/5.0/en/delete.html:目前,您無法從表中刪除並從子查詢中的同一張表中選擇,請參閱下面的答案 – 2010-11-11 13:36:17

回答

73

我不確定您的要求。 我從你的問題中瞭解到你想刪除所有關閉的工作電子郵件。 試試這個;

DELETE e FROM emailNotification e 
LEFT JOIN jobs j ON j.jobId = e.jobId 
WHERE j.active = 1 AND CURDATE() < j.closeDate 
+1

這就是幾乎是的,emailnotification表存儲用戶和工作,它確保用戶不會通過電子郵件發送超過一次給定的工作(想想招聘網站上的工作提醒)。我現在就試試這個。 – 2010-11-11 13:32:00

+8

這是一個很好的答案。這裏細微之處在於你必須在DELETE關鍵字之後包含表別名。我從來沒有這樣做過,但我想在刪除語句中加入JOIN時是必要的。 – Nate 2014-12-04 01:13:03

+2

當你寫下類似'DELETE e,j FROM ...'的作業表「j」時,你也可以刪除匹配行 請參閱[here](http://www.mysqltutorial.org/mysql-delete-加入/) – beipawel 2015-09-21 20:18:37

3

你可以嘗試像以下:

DELETE FROM emailNotification 
WHERE jobId IN (
SELECT jobId FROM jobs j 
WHERE j.active = 1 
) 
+0

感謝您的解釋Patrick – 2010-11-11 13:38:41

5

的MySQL刪除記錄與JOIN

刪除使用單個查詢多個表的多個記錄是如下:

你一般在SELECT語句中使用INNER JOIN從其他表中具有相應記錄的表中選擇記錄。我們還可以使用INNER JOIN子句和DELETE語句來刪除表中的記錄以及其他表中的相應記錄,例如,要從符合特定條件的T1和T2表中刪除記錄,請使用以下語句:

DELETE T1, T2 
FROM T1 
INNER JOIN T2 ON T1.key = T2.key 
WHERE condition 

請注意,您在DELETE和FROM之間放置了表名T1和T2。如果省略T1表,則DELETE語句僅刪除T2表中的記錄,如果省略T2表,則只刪除T1表中的記錄。

加入條件T1.key = T2 .key指定T2表中需要刪除的相應記錄。

WHERE子句中的條件指定需要刪除T1和T2中的哪些記錄。

+2

誰抄襲誰? http://www.mysqltutorial.org/mysql-delete-join/ – random 2015-08-13 20:22:12