はじめに
この記事では、テーブルからSELECTしたデータを削除するSQLを説明します。
[HY000][1093] You can’t specify target table ‘xxx’ for update in FROM clause
次のクエリは、サブクエリでcompaniesテーブルのidを抽出して、companiesのデータを削除しようとしたクエリです。
このときクエリは失敗して、[HY000][1093] You can’t specify target table ‘xxx’ for update in FROM clauseが発生します。
[HY000][1093] You can’t specify target table ‘companies’ for update in FROM clause
DELETE
FROM
companies
WHERE
companies.id IN (
SELECT
companies.id
FROM
companies
LEFT JOIN products
ON products.company_id = companies.id
WHERE
companies.type IN (1, 2)
)
;
調べた結果、以下のドキュメントに辿り着きました。
https://dev.mysql.com/doc/refman/5.7/en/subquery-errors.html
You can use a subquery for assignment within an UPDATE statement because subqueries are legal in UPDATE and DELETE statements as well as in SELECT statements. However, you cannot use the same table (in this case, table t1) for both the subquery FROM clause and the update target.
ドキュメントに書かれている内容を元に、修正したクエリを次に示します。
このクエリは実行可能で、対象のデータの削除に成功しました。
DELETE
FROM
companies
WHERE
companies.id IN (
SELECT
t1.id
FROM
(
SELECT
companies.id
FROM
companies
LEFT JOIN products
ON products.company_id = companies.id
WHERE
companies.type IN (1, 2)
) AS t1
)
;