我试图从一个具有foreign key引用的表(foreign key)中删除,该表将其链接到其他4个表。
我需要删除Table1和Table2引用的所有数据,而不是Table3和Table4引用的所有数据。我已经删除了Table1和Table2中的数据
我试过这样的方法:
delete from MyTable where ID NOT IN(SELECT MyTableID FROM Table1)
delete from MyTable where ID NOT IN(SELECT MyTableID FROM Table2)但是它显然不起作用,因为如果这样做,它会无意中删除Table2引用的数据。
是否有办法从某个表中删除FKs未被某些表引用的表?
发布于 2013-08-13 16:17:08
(在进行了一些基础研究并找到Server中的DELETE语句之后,重写了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 NULLDELETE将只在FROM子句之前的表上操作。您可以使用FROM子句中不受影响的其他表来选择行。此示例将MyTable与您提到的所有表连接起来,然后检查Table1或Table2所引用的行以及Table3和Table4不引用该行的每一行。
发布于 2013-08-13 16:25:52
可能不太有效,但下面的方法应该有效。
它应该“删除MyTable中由Table1和Table2引用的所有数据,而不是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-13 16:31:32
这是@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 NULLhttps://stackoverflow.com/questions/18214070
复制相似问题