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

他のテーブルから参照されていない行を削除するエレガントな方法

    not in の悪名高い落とし穴が 1 つあります。 .基本的に、id not in (1,2,3) は次の省略形です:

    id <> 1 and id <> 2 and id <> 3
      

    TimeEntries の場合 テーブルには TaskID を持つ任意の行が含まれます null の 、not in に変換:

    ID <> null and ID <> 1 and ID <> 2 AND ...
      

    null との比較結果 常にunknownです . unknown以来 where は SQL では真ではありません。 節を使用すると、すべての行が除外され、何も削除されなくなります。

    簡単な修正は、サブクエリに where 句を追加することです:

    DELETE FROM Tasks 
    WHERE  ID not IN 
           (
           SELECT  TaskID 
           FROM    TimeEntries 
           WHERE   TaskID is not null
           )
      

    1. BLOBでDBMS_LOB.SUBSTRを使用すると、ORA-06502になります。

    2. MySQL 5.6-ALGORITHM=inplaceが使用されている場合でもテーブルがロックされる

    3. 逆mysql_real_escape_string

    4. SQLiteは機能しますが、PostgreSQLで移行されたデータベースによりエラーが発生します-Django 3.0