【SQL】テーブルからサブクエリでSELECTしたデータを削除するクエリ

SQL
スポンサーリンク

はじめに

この記事では、テーブルから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
    )
;