sql >> データベース >  >> RDS >> Oracle

最新のものを除くすべてのレコードを削除しますか?

    DELETE FROM student
    WHERE ApplicationDateTime <> (SELECT max(ApplicationDateTime) 
                                  FROM student s2
                                  WHERE s2.StudentID  = student.StudentID)
    

    コメントでの長い議論を踏まえて、次の点に注意してください。

    上記のステートメントはなります ステートメントの実行中にテーブルが変更されたかどうかに関係なく、ステートメントレベルの読み取り整合性を適切に実装するデータベースで作業します。

    でもこれが正しく機能することを私が確実に知っているデータベース テーブルへの同時変更:Oracle(この質問に関するもの)、Postgres、SAP HANA、Firebird(そしておそらくInnoDBを使用するMySQL)。それらはすべて、ステートメントが開始された時点でのデータの一貫したビューを保証するためです。 <>を変更する <へ 彼らのために何も変更しません(この質問が関係しているOracleを含む)

    上記のデータベースの場合、ステートメントはないです。 ファントム読み取りまたは繰り返し不可能な読み取りは複数の間でのみ発生する可能性があるため、分離レベルの影響を受けます ステートメント-シングル内ではありません 声明。

    MVCCを適切に実装せず、同時実行を管理するためにロックに依存している(したがって、同時書き込みアクセスをブロックしている)データベースの場合、テーブルが同時に更新されると、実際には間違った結果が生じる可能性があります。 <を使用した回避策 おそらく必要です。



    1. SQLデータをあるテーブルから別のテーブルに移動する

    2. 間隔データ型から合計秒数を抽出する

    3. 最適化フェーズと逃した機会

    4. SqlServer:ユーザーのログインに失敗しました