2010-11-24 16 views
38

UPDATEを使用してテーブルの行の列の列の値を更新しようとしています。問題は、この列の値を導出するためにサブクエリを使用する必要があり、同じ表に依存することです。クエリは次のとおりです。MySQLの同じテーブルを参照するサブクエリを使用したSQL 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は代わりにこのエラーを吐き出す:

ERROR 1093(HY000):あなたは

があります句から更新のターゲット表「学生」を指定することはできませんがどのように私は更新を行うためにmysqlを強制することができますか?私は100%肯定的なので、行が更新されると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'; 

答えて

42

あなた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 
+5

2つの解決策があった場合、それはいいだろう:特定の1ビットより抽象的、明確なテーブル名や列名を持つが、見ている人のための読書簡素化するために、私のような一般的な答えのために。いずれにしても、質問と回答の両方が私を満足させていますが、私はコミュニティの理解を深めるためにそれを提案していました。ありがとう、+1に両方とも – Nico

+2

これに@Nicoと完全に同意します。そのため、わかりやすい表名と列名を持つ抽象的な例を提供しました(http://stackoverflow.com/a/23772515/886539)。私もJohn Hartsockの答えをアップvvしました(私の事例をたくさん作りました)。 –

1

のためのいくつかの言及私は、「エラー:グループ機能の無効な使用」を取得し、私はそれを行うとき。

しかし、この記事: mysql query to update field to max(field) + 1

作品でも、多くのネスト副選択のことを、示しています。

-3
UPDATE user_account student, (
    SELECT teacher.education_facility_id as teacherid 
    FROM user_account teacher 
    WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER' 
) teach SET student.student_education_facility_id= teach.teacherid WHERE student.user_type = 'ROLE_STUDENT'; 
+0

ちょっとした説明はいつもよりよく、あなたの答えをより価値あるものにします。 – ForceMagic

2
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'; 
5
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文を使用してサブクエリを書くことができ、あなたはそのテーブルのエイリアス名を与える必要はありません。サブクエリテーブルにエイリアス名を付けます。私が試したし、それが明確にテーブル名とカラム名で....私のため

+0

サブクエリでエイリアスが指定されていない場合は、内部テーブルからそのカラムを取得しませんか? – Nishanthan

20

抽象例を正常に動作しています:

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

・ホープ、このヘルプ誰か

@Nico

によって示唆されるように。

+3

好きな作業 – Sinto

+1

抽象的な例として、 '' ON t2.ref_column = t1.column_to_update'''節は '' '' '' column_to_update'''を参照するべきではありません。結合基準は、おそらく異なる列に基づいています。 – frankleonrose

2

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 
+0

mysqlの私のために働いていない – user1732055

+0

私は似たようなものを使用し、魅力のように働いた、ありがとう! (Microsoft SQL SERVER) –

関連する問題