从两个表中删除多个记录

Ret*_*der 0 sql sql-server delete-row

我有两个名为TableA和TableB的表.

TableA具有以下字段:

TableA_ID
FileName
Run Code Online (Sandbox Code Playgroud)

TableB有以下字段:

TableB_ID
TableA_ID
CreationDate
Run Code Online (Sandbox Code Playgroud)

TableA_ID字段上的两个表之间存在外键链接

我需要从两个表中删除记录.我需要查看TableB上的"CreationDate",如果是在特定日期之后,请删除该记录.我还需要删除TableA中的记录,其TableA_ID与TableB中的记录相同

TableB中可能有几个使用TableA_ID(一对多关系)的记录.因此,如果TableB中的条目仍然使用它,我无法删除TableA中的记录.

我知道这不能在一个声明中完成,但很高兴在交易中这样做.我遇到的问题是我不知道该怎么做.我正在使用MS SQL server 2008.如果可能,我不想使用触发器.

Sha*_*nce 5

TableA中是否有记录,TableB中没有匹配的记录?如果没有,那么我们知道从TableB中删除后,我们可以删除TableA中的任何不匹配记录:

begin transaction
delete from TableB
where CreationDate > @SomeDate

delete from TableA
where TableA_ID not in (select TableA_ID from TableB)
end transaction
Run Code Online (Sandbox Code Playgroud)

除此以外:

begin transaction
-- Save the TableA_IDs being deleted:
select distinct TableA_ID
into #TableA_Delete
from Table_B
where CreationDate > @Somedate

-- Depending on the expected size of #TableA_Delete, you may want 
-- to create an index here, to speed up the delete from TableA.

delete from TableB
where CreationDate > @SomeDate

delete from TableA
where TableA_id in (select TableA_Id from #TableA_Delete)
and TableA_id not in (select TableA_id from TableB)
commit transaction
Run Code Online (Sandbox Code Playgroud)

注意以上解决方案都需要添加错误处理.

另外,请参阅NYSystemsAnalyst,了解临时存储ID的另一种方法.