2013-02-19 45 views
5

您好我有以下SQL查詢,給了我ProjectSchemes方案表一個scheme_id其中同時存在。我想刪除Scheme表中沒有記錄的所有記錄到ProjectSchemes表。我該怎麼做?請幫忙。我使用的是MSSQL如何刪除記錄NOT IN

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) 

我試着做以下,但它不工作。不工作方式的影響沒有記錄,但我檢查了我的計劃表也有自己的一個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) 
+0

「不工作」是什麼意思? – wallyk 2013-02-19 09:09:49

+0

你有什麼回報? – uvinod 2013-02-19 09:11:10

+0

您的子選擇可能會返回NULL值。請參閱Rachcha的解決方案答案。你應該指定你的DBMS。 – 2013-02-19 09:15:36

回答

8

我想從假設開始。

  1. 你有一個鏈狀的數據模型: 項目 - * ProjectSchemes - *方案
  2. 你的目標是有唯一有效的鏈條,所以沒有項目沒有ProjectSchemes,沒有ProjectSchemes沒有計劃。
  3. 對於您的某個ID,NULL不是有效值。
  4. 所有ID在他們的桌子
  5. 是獨一無二的你不使用你的數據庫

的引用完整性機制,你的SELECT將列出一個scheme_id在計劃表中的所有方案的結果。

說的是,你應該開始刪除所有沒有相應項目的ProjectSchemes。這些都是ProjectSchemes與NULL的ID或不存在於項目表中的ID:

DELETE ProjectSchemes WHERE (Project_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM Projects WHERE 
      Projects.Project_Id = ProjectSchemes.Project_Id)) 

刪除ProjectsSchemes沒有一個項目之後,我們現在可能在計劃表中的一些新的孤兒。接下來的事情,現在是要刪除的有NULL的ID或不存在於ProjectsSchemes表中的ID的所有計劃:

DELETE Schemes WHERE (Scheme_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE 
      ProjectSchemes.Scheme_Id = Schemes.Scheme_Id)) 

還有一個機會,有未連接到一個項目,而不方案刪除ProjectSchemes。

+0

工程就像一個魅力!你真的瞭解問題。感謝您的幫助,現在我能夠擺脫這些記錄! – 2013-02-19 11:52:58

8
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 
    ) 
+0

好的。並用'NULL'和'NOT IN'解決問題。 – 2013-02-19 09:14:50

+0

我收到錯誤「附近的語法不正確」。 WHERE有紅色下劃線。我正在使用MSSQL – 2013-02-19 09:24:37

+2

編輯完成。這應該工作。 – Rachcha 2013-02-19 09:29:33

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 
+0

我試過這個查詢,但它說「(0 row(s)affected)」也許找不到記錄ps.Scheme_Id IS NULL? ProjectScheme.Scheme_Id具有記錄,並且沒有條目具有NULL。它發生的情況是,Schema和ProjectSchemes都沒有被FK強制執行,這就是爲什麼在Schemes表上沒有條目的項目計劃中有這麼多記錄。 – 2013-02-19 09:29:04

+0

如果你說這個查詢(0 row(s)affected),那麼這意味着在Schemes表中沒有與ProjectSchemes表關聯的記錄 – 2013-02-19 09:44:18

+0

也許你想從ProjectSchemes表中刪除與Schemes表無關的記錄? – 2013-02-19 09:57:58