2016-05-31 6 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'のターゲットとデータの別のソースの両方として2回指定されていますが、クエリには何かがありますか? MySQLでは

+0

"FROM"句から生徒を削除しようとしましたか? –

+0

どこにでも 'tbl_student'が表示されず、閉じ括弧がありません。ターゲットデータベースシステムとは何ですか?(SQL Server?MySql?Oracle? –

+0

)MySQLを使用している場合は、http://stackoverflow.com/questions/45494 –

答えて

2

、あなたはjoinupdateを使用してこの操作を行います。

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構文を使用します。
  • テーブルのエイリアスを使用すると、クエリの書き込みと読み込みが簡単になります。
+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

関連する問題