我正在尝试从包含MyTable
引用的表(foreign key
)中删除它,并将其链接到其他4个表。
我需要删除MyTable
和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
的表中删除?
答案 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
与您提及的所有表连接,然后检查Table1
或Table2
引用行和行{{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)