web-dev-qa-db-ja.com

ないレコードを削除する方法

こんにちは私は私にProjectSchemesSchemesテーブルの両方に存在するScheme_Idを与える次のSQLクエリを持っています。 Schemesテーブルからレコードのないすべてのレコードを削除したいProjectSchemesテーブル。どうすればよいですか?助けてください。私はMSSQLを使用しています

select scheme_id from Schemes where Scheme_Id
in(select s.Scheme_Id from Projects p 
inner join ProjectSchemes ps on ps.Project_Id=p.Project_Id
inner join Schemes s on s.Scheme_Id=ps.Scheme_Id)

次のことを実行しようとしていますが、機能していません。機能しないということは、影響を受けるレコードがないことを意味しますが、Schemesテーブルを確認したところ、Scheme_idがProjectSchemesテーブルに見つからないほど多くのレコードがあります

delete from Schemes where Scheme_Id
not in(select s.Scheme_Id from Projects p 
inner join ProjectSchemes ps on ps.Project_Id=p.Project_Id 
inner join Schemes s on s.Scheme_Id=ps.Scheme_Id)
7
Jobert Enamno

仮定から始めたいと思います。

  1. チェーンのようなデータモデルがあります:Projects- * ProjectSchemes- * Schemes
  2. ターゲットは有効なチェーンのみを持つことです。したがって、ProjectなしのProjectSchemes、ProjectSchemesなしのSchemesはありません。
  3. NULLは、いずれかのIDの有効な値ではありません。
  4. すべてのIDはテーブル内で一意です
  5. データベースの参照整合性メカニズムを使用していません

その結果、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を削除せずに、プロジェクトに接続されていないスキームが存在する可能性はまだあります。

8
S.Roeper
DELETE FROM schemes
WHERE scheme_id NOT IN (
    SELECT DISTINCT scheme_id
    FROM projectschemes
    WHERE scheme_id IS NOT NULL
)

または、代わりに使用することもできます

DELETE
FROM schemes
WHERE NOT EXISTS (
      SELECT 1
        FROM projectschemes
       WHERE projectschemes.scheme_id = schemes.ID
      )
9
Rachcha
DELETE s
FROM Schemes s LEFT JOIN ProjectSchemes ps ON s.Scheme_Id=ps.Scheme_Id
WHERE ps.Scheme_Id IS NULL

しかし、これが必要なようです

DELETE sp
FROM ProjectSchemes sp LEFT JOIN Schemes s ON sp.Scheme_Id=s.Scheme_Id
WHERE s.Scheme_Id IS NULL
3