0

我正在尝试从具有将其链接到其他 4 个表MyTable的引用的表()中删除。foreign key

我需要删除andMyTable引用的所有数据,但不是and 。我已经删除了和中的数据Table1Table2Table3Table4Table1Table2

我试过这样的事情:

delete from MyTable where ID NOT IN(SELECT MyTableID FROM Table1)
delete from MyTable where ID NOT IN(SELECT MyTableID FROM Table2)

但它显然不起作用,因为如果这样做,它会无意中删除Table2引用的数据。

FKs有没有办法从某些表没有引用的表中删除?

4

4 回答 4

2

(经过一些基础研究并找到SQL Server 中的 DELETE 语句后,重写了 SQL Server 语法的答案。)

使用DELETE语句的多表语法。

DELETE
  MyTable
FROM
  MyTable
  LEFT JOIN Table1 ON MyTable.ID = Table1.MyTableID
  LEFT JOIN Table2 ON MyTable.ID = Table2.MyTableID
  LEFT JOIN Table3 ON MyTable.ID = Table3.MyTableID
  LEFT JOIN Table4 ON MyTable.ID = Table4.MyTableID
WHERE
  (Table1.MyTableID IS NOT NULL OR Table2.MyTableID IS NOT NULL)
  AND Table3.MyTableID IS NULL
  AND Table4.MyTableID IS NULL

DELETE只会对子句之前的表进行操作。您可以在不受影响FROM的子句中使用其他表来选择行。FROM此示例MyTable与您提到的所有表连接,然后检查每一行是否Table1Table2引用该行以及该行Table3Table4不引用该行。

于 2013-08-13T16:17:08.373 回答
0

这应该有效:

delete from MyTable
where 1=1
    AND ID NOT IN(SELECT MyTableID FROM Table1)
    AND ID NOT IN(SELECT MyTableID FROM Table2)
于 2013-08-13T16:32:14.263 回答
0

可能效率不高,但以下应该可以工作。

它应该“删除 Table1 和 Table2 引用的 MyTable 中的所有数据,但不删除 Table3 和 Table4”。您的查询似乎与希望执行此操作不完全匹配。

DELETE FROM MyTable
WHERE
  ID IN (SELECT MyTableID FROM Table1) AND
  ID IN (SELECT MyTableID FROM Table2) AND
  ID NOT IN (SELECT MyTableID FROM Table3) AND
  ID NOT IN (SELECT MyTableID FROM Table4)
于 2013-08-13T16:25:52.873 回答
0

这是@ThomaCreemers 转换为SQL Server语法

DELETE MyTable
FROM MyTable
  LEFT JOIN Table1 ON MyTable.ID = Table1.MyTableID
  LEFT JOIN Table2 ON MyTable.ID = Table2.MyTableID
  LEFT JOIN Table3 ON MyTable.ID = Table3.MyTableID
  LEFT JOIN Table4 ON MyTable.ID = Table4.MyTableID
WHERE
  (Table1.MyTableID IS NOT NULL OR Table2.MyTableID IS NOT NULL)
  AND Table3.MyTableID IS NULL
  AND Table4.MyTableID IS NULL
于 2013-08-13T16:31:32.623 回答