12

嗨,我有以下 SQL 查询,它给了我在ProjectSchemesSchemes表中都存在的Scheme_Id 。我想从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 表时,记录太多以至于在 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
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 回答
11

我想从假设开始。

  1. 你有一个链式数据模型: Projects --* ProjectSchemes --* Schemes
  2. 你的目标是只有有效的链,所以没有没有项目的项目方案,没有没有项目方案的方案。
  3. NULL 不是您的其中一个 ID 的有效值。
  4. 所有 id 在他们的表中都是唯一的
  5. 您不使用数据库的参照完整性机制

因此,您的 SELECT 将在 Schemes 表中列出所有 Schemes 的 scheme_id。

也就是说,您应该开始删除所有没有相应项目的 ProjectSchemes。这些是 ID 为 NULL 或 ID 不存在于 Projects 表中的 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 或 ID 不存在于 ProjectsSchemes 表中的方案:

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 回答
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 回答