12

こんにちは私はProjectSchemesSchemesテーブルの両方に存在するScheme_Idを与える次のSQLクエリを持っています。ProjectSchemesテーブルへのレコードがないSchemesテーブルからすべてのレコードを削除したい。どうすればいいですか?助けてください。私は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テーブルを確認したところ、レコードが多すぎるため、ProjectSchemesテーブルでscheme_idが見つかりません。

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)
4

3 に答える 3

11

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

  1. チェーンのようなデータモデルがあります:Projects-* ProjectSchemes-* Schemes
  2. ターゲットは有効なチェーンのみを持つことです。したがって、ProjectなしのProjectSchemes、ProjectSchemesなしのSchemesはありません。
  3. NULLは、IDの1つに有効な値ではありません。
  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を削除せずに、プロジェクトに接続されていないスキームが存在する可能性はまだあります。

于 2013-02-19T10:18:48.820 に答える
11
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
      )
于 2013-02-19T09:12:39.257 に答える
3
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
于 2013-02-19T09:15:22.803 に答える