繁体   English   中英

SQL:我的查询出了什么问题

[英]SQL: what is wrong in my query

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

简短的表架构如下:
学生(id,姓名,...,delete_time)
class(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'被指定两次,既作为'UPDATE'的目标,又作为数据的单独源,查询中是否有内容?

在MySQL中,您可以使用带有join 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;

笔记:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM