刷数据库面试试题时出现的错误和解决方法(一)

题目:把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩:

环境:编辑工具:sqlyog  数据库:mysql

描述:此题的三个表:

course表(课程表)sc表(成绩表)

teacher表(教师表)

开始的sql语句

UPDATE sc
SET score = (SELECT
               AVG(sc_1.score)
             FROM sc sc_1
             WHERE c.Cnum = sc_1.Cnum)
WHERE Cnum IN(SELECT
                course.Cnum
              FROM course,
                teacher
              WHERE teacher.Tname = '叶平'
                  AND teacher.Tnum = course.Tnum);
出现错误:You can't specify target table 'sc' for update in FROM clause,意思就是在同一个语句中你不能先查询出sc表的某些值,再更新sc表,那么久迂回一下吧,创建一个子句,在子句中查询吧:
UPDATE sc
SET score = (SELECT
               a.avgScore
             FROM (SELECT
                     AVG(sc_1.score)    avgScore
                   FROM sc sc_1
                   WHERE c.Cnum = sc_1.Cnum) a)
WHERE Cnum IN(SELECT
                course.Cnum
              FROM course,
                teacher
              WHERE teacher.Tname = '叶平'
                  AND teacher.Tnum = course.Tnum);
(这个问题只有在mysql中会出现)然后问题又来了:Unknown column 'sc.Cnum' in 'where clause'

sc.Cnum未知?不会吧,可能是这个查询语句套了很多层的缘故吧,思考了很久,换了很多方法:

UPDATE sc
SET score = (SELECT
               a.avgScore
             FROM (SELECT
                     AVG(sc_1.score)    avgScore
                   FROM sc sc_1,(SELECT * FROM sc )c
                   WHERE c.Cnum = sc_1.Cnum) a)
WHERE Cnum IN(SELECT
                course.Cnum
              FROM course,
                teacher
              WHERE teacher.Tname = '叶平'
                  AND teacher.Tnum = course.Tnum);
既然找不到sc表,那我就在前面把你这个表加上就好了。修改成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值