从具有外键的表中删除到其他表

时间:2013-08-13 16:10:56

标签: sql sql-server

我正在尝试从包含MyTable引用的表(foreign key)中删除它,并将其链接到其他4个表。

我需要删除MyTableTable1引用的所有数据Table2,但不是Table3Table4。我已经删除了Table1Table2

中的数据

我试过这样的事情:

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 个答案:

答案 0 :(得分:2)

(在一些基础研究和发现The DELETE statement in SQL Server之后重写了对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引用行和行{{1}的每一行并且Table3不引用该行。

答案 1 :(得分:0)

可能效率不高,但下面应该有效。

它应该“删除Table1和Table2引用的所有数据[in] 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)

答案 2 :(得分: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

答案 3 :(得分:0)

这应该有效:

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