web-dev-qa-db-ja.com

MySQLの同じテーブルを参照するサブクエリを含むSQL UPDATE

UPDATEを使用して、テーブル内の一連の行の列の値を更新しようとしています。問題は、サブクエリを使用してこの列の値を取得する必要があり、同じテーブルに依存していることです。クエリは次のとおりです。

UPDATE user_account student
SET student.student_education_facility_id = (
   SELECT teacher.education_facility_id
   FROM user_account teacher
   WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER'
)
WHERE student.user_type = 'ROLE_STUDENT';

通常、教師と生徒が2つの異なるテーブルにいる場合、mysqlは文句を言いません。しかし、両方が同じテーブルを使用しているため、mysqlは代わりにこのエラーを出力します。

エラー1093(HY000):FROM句で更新するターゲットテーブル 'student'を指定できません

Mysqlに更新を強制させる方法はありますか?行が更新されてもfrom句は影響を受けません。

そうでない場合、この更新SQLを書いて同じ効果を達成する別の方法はありますか?

ありがとう!

編集:私はそれが動作するようになったと思う:

UPDATE user_account student
LEFT JOIN user_account teacher ON teacher.user_account_id = student.teacher_id
SET student.student_education_facility_id = teacher.education_facility_id
WHERE student.user_type = 'ROLE_STUDENT';
40
egervari

あなたのための参考資料 http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE user_account student 
INNER JOIN user_account teacher ON
   teacher.user_account_id = student.teacher_id 
   AND teacher.user_type = 'ROLE_TEACHER'
SET student.student_education_facility_id = teacher.education_facility_id
45
John Hartsock

より明確なテーブル名と列名を持つ抽象的な例:

UPDATE tableName t1
INNER JOIN tableName t2 ON t2.ref_column = t1.ref_column
SET t1.column_to_update = t2.column_desired_value

@Nicoが提案したとおり

これが誰かを助けることを願っています。

20
Simon Arnold
UPDATE user_account 
SET (student_education_facility_id) = ( 
    SELECT teacher.education_facility_id
    FROM user_account teacher
    WHERE teacher.user_account_id = teacher_id
    AND teacher.user_type = 'ROLE_TEACHER'
)
WHERE user_type = 'ROLE_STUDENT'

上記は更新クエリのサンプルです...

更新SQLステートメントを使用してサブクエリを作成できます。そのテーブルのエイリアス名を指定する必要はありません。サブクエリテーブルにエイリアス名を付けます。試しましたが、うまく機能しています。

5
Ricky Patel
UPDATE user_account student

SET (student.student_education_facility_id) = (

   SELECT teacher.education_facility_id

   FROM user_account teacher

   WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER'

)

WHERE student.user_type = 'ROLE_STUDENT';
2
Sin2

これはSQL Serverに必要でした。ここにあります:

UPDATE user_account 
SET student_education_facility_id = cnt.education_facility_id
from  (
   SELECT user_account_id,education_facility_id
   FROM user_account 
   WHERE user_type = 'ROLE_TEACHER'
) as cnt
WHERE user_account.user_type = 'ROLE_STUDENT' and cnt.user_account_id = user_account.teacher_id

他のRDBMSでも機能すると思います(ご確認ください)。拡張可能なため、構文が気に入っています。

実際に必要な形式は次のとおりです。

UPDATE table1 
SET f1 = cnt.computed_column
from  (
   SELECT id,computed_column --can be any complex subquery
   FROM table1
) as cnt
WHERE cnt.id = table1.id
2
Mahmoodvcs