web-dev-qa-db-ja.com

結合を使用して1つのテーブルから削除する

別のデータベースの選択基準に基づいて、あるデータベースからレコードを削除しようとしています。ジョブとメールのリストを保存するemailNotificationという2つのテーブルがあります。次に、仕事があります。終了したジョブのemailNotificationsをクリアしたい。 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」を指定できません。

33
Julian Young

あなたの要件についてはわかりません。あなたの質問から私が理解したことは、あなたが閉じている仕事のすべての電子メールを削除したいということです。これを試してください。

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

JOINを使用したMySQL DELETEレコード

単一クエリを使用して複数のテーブルから複数のレコードを削除するには、次のようにします。

通常、SELECTステートメントでINNER JOINを使用して、他のテーブルに対応するレコードがあるテーブルからレコードを選択します。また、DELETEステートメントでINNER JOIN句を使用して、テーブルからレコードを削除し、他のテーブルの対応するレコードも削除できます。たとえば、特定の条件を満たす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のどのレコードを削除する必要があるかを指定します。

8
Aman Garg

次のようなものを試すことができます:

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

目的が、2番目にリレーションを持つ1番目のテーブルの行を削除するなど、一致する行を削除する場合、1番目のテーブル全体の削除を避けるために、2番目のテーブルに追加の「where」条件を追加する必要があります

DELETE f FROM firsttable f 
LEFT JOIN secondtable s ON f.related_id = .jobId 
WHERE s.related_id
1
Mahmut Gulerce