2016-05-31 79 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