2010-11-24 54 views
38

Estoy tratando de actualizar el valor de una columna en un grupo de filas en una tabla utilizando ACTUALIZAR. El problema es que necesito usar una subconsulta para derivar el valor para esta columna, y depende de la misma tabla. Aquí está la consulta:ACTUALIZACIÓN SQL con sub-consulta que hace referencia a la misma tabla en MySQL

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'; 

Normalmente si el maestro y el estudiante estaban en 2 tablas diferentes, MySQL ¿No se quejan. Pero ya que ambas utilizan la misma tabla, MySQL arroja este error en su lugar:

ERROR 1093 (HY000): No se puede especificar la tabla de destino 'estudiante' para la actualización en la cláusula DE

¿Hay ¿De alguna manera puedo forzar a mysql a hacer la actualización? Estoy 100% seguro de que la cláusula from no se verá afectada a medida que se actualicen las filas.

Si no, ¿hay alguna otra forma en que pueda escribir esta actualización sql para lograr el mismo efecto?

Gracias!

EDIT: Creo que tengo que trabajar:

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'; 

Respuesta

42

Algunos de referencia para que 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

Sería bueno si había dos soluciones: la específica y uno un poco más abstracto, con más claros los nombres de tablas y columnas, para simplificar la lectura para las personas que buscan para una respuesta general, como yo.En cualquier caso, tanto la pregunta como la respuesta me satisfacen, pero lo sugerí para una mejor comprensión de la comunidad. Gracias, y +1 a ambos – Nico

+2

Totalmente de acuerdo con @Nico en esto. Es por eso que proporcioné un ejemplo abstracto con nombres de tabla y columna más claros (http://stackoverflow.com/a/23772515/886539). También volví a votar la respuesta de John Hartsock (me ayudó mucho a crear mi ejemplo). –

-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

Una pequeña explicación siempre es mejor y hace que su respuesta sea más valiosa. – 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' 

anteriores son muestra de la consulta de actualización ...

Usted puede escribir la consulta sub con instrucción SQL de actualización, no es necesario dar nombre de alias para esa tabla. dar nombre de alias a la tabla de sub consulta. Probé y está funcionando bien para mí ....

+0

Cuando no se especifica ningún alias en la consulta secundaria, ¿no toma la columna de la tabla interna? – Nishanthan

20

ejemplo abstracto con las más claras nombres de tabla y columna:

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

Como sugiere @Nico

Esperanza esta ayuda a alguien.

+3

buen trabajo, como él – Sinto

+1

Para un ejemplo abstracto, la cláusula '' 'ON t2.ref_column = t1.column_to_update''' no debería referirse a' '' column_to_update'''. El criterio de unión probablemente se basa en una columna diferente. – frankleonrose

2

Lo necesitaba para SQL Server. Aquí está:

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 

creo que funciona con otros RDBMS (por favor confirmar). Me gusta la sintaxis porque es extensible.

El formato que necesitaba era en realidad esto:

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

no funciona para mí en mysql – user1732055

+0

Fantástico utilicé algo similar y funcionó como un amuleto, ¡gracias! (SERVIDOR Microsoft SQL) –

Cuestiones relacionadas