2016-05-31 75 views
1

我有一个包含3个表(student,class和student_class)的数据库。在类表中有一些类的删除时间设置为NOT NULL。我想更新这些课程的学生到当前时间的删除时间。SQL:我的查询出了什么问题

短表架构如下:
学生(ID,姓名,...,delete_time)
类(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'的目标,也作为数据的独立源,是否有任何查询?

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; 

注:

+0

您是否尝试从“FROM”子句中删除学生? –

+0

我在任何地方都看不到'tbl_student',而且你错过了一个右括号。什么是目标数据库系统(SQL Server?MySql?Oracle?) –

+0

如果您使用的是MySQL,它可能是http://stackoverflow.com/questions/45494 –

回答

2

在MySQL中,你使用updatejoin会做

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

非常感谢它的工作 – george

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 
) 
); 
+0

感谢您的帮助您的查询只更新了一名学生。 – george