代码改变世界

MYSQL出现“ You can't specify target table '表名' for update in FROM clause”

  猎手家园  阅读(349)  评论(0编辑  收藏  举报

You can't specify target table '表名' for update in FROM clause

翻译:不能先select出同一表中的某些值,再update这个表(在同一语句中)

 

一、案例

1、有三张表,分别是:学生表,班级表,成绩表

学生表:

 

班级表:

 

成绩表:

 

题目要求:给大一成绩不合格的分数加5分。

 

2、思路

第一步:查询出大一成绩不合格的成绩集合

SELECT res.StudentResult
FROM student stu
JOIN result res on res.StudentNo=res.StudentNo
where res.StudentResult<60 and stu.GradeId=(
SELECT GradeId FROM grade WHERE GradeName='大一' )

 

第二步:修改不合格成绩

复制代码
UPDATE result 
SET StudentResult=StudentResult+5
WHERE StudentResult in( 
    SELECT res.StudentResult
    FROM student stu
    JOIN result res on res.StudentNo=res.StudentNo
    WHERE res.StudentResult=53 and stu.GradeId=(
        SELECT GradeId
        FROM grade
        WHERE GradeName='大一'
    )    
)
复制代码

 

此时报错:1093 - You can't specify target table 'result' for update in FROM clause 

 

二、正解写法

复制代码
UPDATE result 
SET StudentResult=StudentResult+5
WHERE StudentResult in ( 
    SELECT a.StudentResult from (
        SELECT res.StudentResult
        FROM student stu
        JOIN result res on res.StudentNo=res.StudentNo
        WHERE res.StudentResult=53 and stu.GradeId=(
            SELECT GradeId
            FROM grade
            WHERE GradeName='大一'
        )
    ) AS a
)
复制代码

也就是说:把结果集当作一个表,自我查询一遍。

格式为:SELECT a.StudentResult FROM (结果集)a

 

相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2017-04-26 Kibana5.x界面简要介绍(含x-pack插件)
点击右上角即可分享
微信分享提示