仮定から始めたいと思います。
- チェーンのようなデータモデルがあります:Projects-*ProjectSchemes-*スキーム
- ターゲットは有効なチェーンのみを持つことであるため、ProjectなしのProjectSchemes、ProjectSchemesなしのSchemesはありません。
- NULLはいずれかのIDの有効な値ではありません。
- すべてのIDはテーブル内で一意です
- データベースの参照整合性メカニズムを使用しない
その結果、SELECTはSchemesテーブル内のすべてのSchemesのscheme_idを一覧表示します。
そうは言っても、対応するプロジェクトなしですべてのProjectSchemesの削除を開始する必要があります。これらは、IDがNULLまたはプロジェクトテーブルに存在しないIDを持つProjectSchemesです:
DELETE ProjectSchemes WHERE (Project_Id is NULL) OR
(NOT EXISTS (SELECT * FROM Projects WHERE
Projects.Project_Id = ProjectSchemes.Project_Id))
プロジェクトなしでProjectsSchemesを削除した後、Schemesテーブルにいくつかの新しい孤立が存在する可能性があります。次に、IDがNULLであるか、ProjectsSchemesテーブルに存在しないIDを持つすべてのスキームを削除します。
DELETE Schemes WHERE (Scheme_Id is NULL) OR
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE
ProjectSchemes.Scheme_Id = Schemes.Scheme_Id))
ProjectSchemesを削除しないと、プロジェクトに接続されていないスキームが存在する可能性があります。