Sql server 删除没有引用约束的记录的方法
我有一个表,它有很多依赖项,但其中的大多数记录实际上没有在其他地方引用。我想发出一个delete命令,但如果遇到这样的记录,它不会失败——只需删除那些没有依赖项的记录,而保留其他记录不变 此删除命令将从我的ASP.NET web应用程序中调用,将来此表可能会有其他依赖项或结构更改。我不想每次都更改delete命令Sql server 删除没有引用约束的记录的方法,sql-server,tsql,Sql Server,Tsql,我有一个表,它有很多依赖项,但其中的大多数记录实际上没有在其他地方引用。我想发出一个delete命令,但如果遇到这样的记录,它不会失败——只需删除那些没有依赖项的记录,而保留其他记录不变 此删除命令将从我的ASP.NET web应用程序中调用,将来此表可能会有其他依赖项或结构更改。我不想每次都更改delete命令 最快的方法是什么?方法是只尝试删除没有引用记录的记录,例如: delete from MyTableA where not exists (select 1 from MyTableB
最快的方法是什么?方法是只尝试删除没有引用记录的记录,例如:
delete
from MyTableA
where not exists (select 1 from MyTableB B where B.MyTableAID = MyTableA.MyTableAID)
-- etc for all referencing tables
如果将其放在存储过程中,则无论何时更新数据库结构都相对容易更新,而无需修改代码。这样做的方法是只尝试删除没有引用记录的记录,例如
delete
from MyTableA
where not exists (select 1 from MyTableB B where B.MyTableAID = MyTableA.MyTableAID)
-- etc for all referencing tables
如果将其放在存储过程中,则无论何时更新数据库结构都相对容易更新,而无需修改代码。作为Dale答案的补充,我们还可以使用CTE中的内部联接来表示删除。然后,从该CTE中删除:
WITH cte AS (
SELECT a.*
FROM MyTableA a
LEFT JOIN MyTableB b ON a.MyTableAID = b.MyTableAID
WHERE b.MyTableAID IS NULL
)
DELETE
FROM cte;
作为Dale答案的补充,我们还可以在CTE中使用内部连接来表达delete。然后,从该CTE中删除:
WITH cte AS (
SELECT a.*
FROM MyTableA a
LEFT JOIN MyTableB b ON a.MyTableAID = b.MyTableAID
WHERE b.MyTableAID IS NULL
)
DELETE
FROM cte;
您需要编写一个查询来查找所有具有引用的记录,并将它们从删除中排除。这是唯一的办法。这能回答你的问题吗?您需要编写一个查询来查找所有具有引用的记录,并将它们从删除中排除。这是唯一的办法。这能回答你的问题吗?我希望避免这种情况,因为此脚本将从我的asp.net web应用程序中调用,并且将来此表可能会有其他依赖项或结构更改。而且我不想每次都改变它。@Riz没有其他简单的方法可以做到这一点-您可以编写动态SQL,它首先查询现有的引用关系,然后构建与上面类似的查询,但这不是SQL的工作方式。@Riz如果您想自动删除/清理,那么可以使用级联删除。如果你不能做到这一点,那么这个答案可能是描述你想要的逻辑的最准确的方式+1。谢谢,我相信你的话,并将此标记为答案,因为它使我最接近我想要的。我希望避免这种情况,因为此脚本将从我的asp.net web应用程序中调用,并且将来此表可能会有其他依赖项或结构更改。而且我不想每次都改变它。@Riz没有其他简单的方法可以做到这一点-您可以编写动态SQL,它首先查询现有的引用关系,然后构建与上面类似的查询,但这不是SQL的工作方式。@Riz如果您想自动删除/清理,那么可以使用级联删除。如果你不能做到这一点,那么这个答案可能是描述你想要的逻辑的最准确的方式+1。谢谢,我相信你的话,并将此标记为答案,因为它使我最接近我想要的。我希望避免这种情况,因为此脚本将从我的asp.net web应用程序中调用,并且将来此表可能会有其他依赖项或结构更改。我不想每次你在最初的问题中没有提到这一点的时候都要改变这一点。对于一般的SQL Server解决方案,我给出的答案非常合理。@TimBiegeleisen这样做有好处吗?只是好奇:@DaleK SQL Server中删除连接的语法可能有点复杂,至少对我来说是这样。“从CTE中删除”选项允许您编写基本的select SQL,然后可以将其转过来并应用于执行删除操作。这实际上似乎删除了具有依赖项的记录,然而,我希望跳过删除此类记录。我希望避免这种情况,因为此脚本将从我的asp.net web应用程序中调用,并且将来此表可能会有其他依赖项或结构更改。我不想每次你在最初的问题中没有提到这一点的时候都要改变这一点。对于一般的SQL Server解决方案,我给出的答案非常合理。@TimBiegeleisen这样做有好处吗?只是好奇:@DaleK SQL Server中删除连接的语法可能有点复杂,至少对我来说是这样。“从CTE中删除”选项允许您编写基本的select SQL,然后可以将其转过来并应用于执行删除操作。这实际上似乎删除了具有依赖关系的记录,而我希望跳过删除此类记录。