【问题标题】:SQL: what is wrong in my querySQL:我的查询出了什么问题
【发布时间】:2016-05-31 21:12:49
【问题描述】:

我有一个包含 3 个表(student、class 和 student_class)的数据库。在类表中有一些类的删除时间设置为 NOT NULL。我想将这些班级的学生的删除时间更新为当前时间。

短表架构如下:
学生(ID,姓名,...,删除时间)
类(id,名称,...,delete_time)
student_class(id, studentId, classId)

我尝试过的查询:

    UPDATE student SET delete_time = now() WHERE id IN ( 
        SELECT student.id FROM student, student_class,class WHERE
            student.id = student_class.studentId AND
            student_class.classId= class.id AND
            class.delete_time IS NOT NULL

但它没有工作我收到一个错误说:

#1093 - 表 'tbl_student' 被指定了两次,既作为 'UPDATE' 的目标,又作为数据的单独源,是否有任何查询?

【问题讨论】:

  • 您是否尝试从“FROM”子句中删除学生?
  • 我在任何地方都看不到tbl_student,而且您缺少右括号。目标数据库系统是什么(SQL Server?MySql?Oracle?
  • 如果您使用的是 MySQL,它可能与 stackoverflow.com/questions/45494 重复
  • 可能是 MySQL 的愚蠢限制,您无法引用正在更新的表。

标签: mysql sql


【解决方案1】:

在 MySQL 中,您可以使用 updatejoin

update student s join
       student_class sc
       on s.id = sc.studentid join
       class c
       on c.id = sc.classid
    set s.delete_time = now()
    where c.delete_time is not null;

注意事项:

  • 您得到的错误是特定于 MySQL 的;您不能修改表并将其包含在子查询中。
  • 简单规则:从不FROM 子句中使用逗号。 总是使用明确的JOIN 语法。
  • 表别名使查询更易于编写和阅读。

【讨论】:

    【解决方案2】:

    因为您可能在 student_class 中的不同学生和班级之间有多个链接,所以您无法通过选择 FROM 多个表来创建交叉表。你可以创建一个嵌套的SELECT

    UPDATE student s SET s.delete_time = now() WHERE s.id IN (
      SELECT sc.student_id from student_class sc where sc.student_id = s.id AND sc.class_id IN (
        SELECT c.Id FROM Class c WHERE sc.class_id = c.id AND delete_time IS NULL
      )
    );
    

    【讨论】:

    • 感谢您的帮助,您的查询仅更新了一名学生。我得到的第一个效果很好
    猜你喜欢
    • 2016-10-29
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多