SQL:我的查询有什么问题

时间:2016-05-31 21:12:50

标签: mysql sql

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

短表架构如下:
学生(id,name,...,delete_time)
类(id,name,...,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'被指定两次,两者都作为'更新'的目标。作为一个单独的数据来源,有什么查询?

2 个答案:

答案 0 :(得分:2)

在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语法。
  • 表别名使查询更容易编写和阅读。

答案 1 :(得分:0)

因为您可以在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
  )
);