こんにちは私は私にProjectSchemesとSchemesテーブルの両方に存在する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)
仮定から始めたいと思います。
その結果、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を削除せずに、プロジェクトに接続されていないスキームが存在する可能性はまだあります。
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
)
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