ОБНОВЛЕНИЕ SQL с подзапросом, который ссылается на ту же таблицу в MySQL - PullRequest
40 голосов
/ 24 ноября 2010

Я пытаюсь обновить значение столбца в связке строк в таблице, используя 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';

Обычно, если бы учитель и ученик были в двух разных таблицах, mysql не жаловался бы.Но так как они оба используют одну и ту же таблицу, mysql выдает эту ошибку вместо:

ОШИБКА 1093 (HY000): Вы не можете указать целевую таблицу 'student' для обновления в предложении FROM

Есть ли способ заставить 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';

Ответы [ 6 ]

44 голосов
/ 24 ноября 2010

Некоторая справка для вас 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
20 голосов
/ 21 мая 2014

Абстрактный пример с более понятными именами таблиц и столбцов:

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

По предложению @ Nico

Надеюсь, это кому-нибудь поможет.

5 голосов
/ 20 ноября 2013
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, вам не нужно указывать псевдоним для этой таблицы.присвойте псевдониму таблицу подзапросов.Я пытался, и это работает нормально для меня ....

2 голосов
/ 23 февраля 2015

Мне нужно это для 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 голосов
/ 07 июня 2013
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';
0 голосов
/ 07 июня 2012
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';
...