我正在尝试使用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):您无法在FROM子句中指定目标表'student'进行更新
有什么方法可以强制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';
答案 0 :(得分:44)
为您提供一些参考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
答案 1 :(得分: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所建议的
希望这有助于某人。
答案 2 :(得分: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语句编写子查询,您不需要为该表提供别名。为别查询表提供别名。我试过了,它对我来说很好....
答案 3 :(得分: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';
答案 4 :(得分: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
答案 5 :(得分:0)
我需要在子查询中求和,但没有一个解决方案有效。 所以我在主表上创建了一个视图,可以从中访问同一个表。
Create user_account_VW as select * from user_account
UPDATE user_account
SET user_account.student_education_facility_id =
(SELECT user_account_VW.education_facility_id
FROM user_account_VW
WHERE user_account_VW.user_account_id = user_account.teacher_id
AND user_account_VW.user_type = 'ROLE_TEACHER')
答案 6 :(得分:-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';