君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

You can't specify target table '***' for update in FROM clause〜MySQLにて、サブクエリのみに適用されるエラーがある〜

f:id:karoten512:20180308112401p:plain

こういう感じのSQLを書いた

UPDATE parent
  SET name = 'hogehoge'
WHERE
  parent_id
IN
  (
      SELECT
        parent.parent_id
      FROM
        parent
      LEFT JOIN
        children as c
      ON
        parent.parent_id = c.parent_id
  );

そしたらこんなエラーが出てきた

You can't specify target table 'parent' for update in FROM clause

??

ぐぐったら公式サイトがでてきた

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.10.9 サブクエリーのエラー

このエラーは、テーブルを変更し、さらにサブクエリーで同じテーブルから選択しようとする次のような場合に発生します。

へえ。

解決方法

IN句のなかのSELECTを、更に副問合せにしてしまう。

適当にtmpという名前をつける。

UPDATE parent
  SET name = 'hogehoge'
WHERE
  parent_id
IN
  (
    SELECT
      tmp.parent_id
    FROM
    (
      SELECT
        parent.parent_id
      FROM
        parent
      JOIN
        children as c
      ON
        parent.parent_id = c.parent_id
      )
    as tmp
  );

これでうごいた。