在 sql 服务器中从具有两个父项的子项 table 中删除,没有级联删除

Delete from child table with two parents without cascade delete in sql server

我需要你的指导。 我创建了一个脚本来分别从 3 table 中删除。 意思是当我创建脚本时是从 table3 (child) 中删除 然后从 2(子)中删除,然后从 table1(父)中删除 我在使用 Table3 时遇到问题,因为 table2 对于 table2 和 table1 所以我不能在删除之前删除它 table2 如果我先删除 table2 然后我失去了我用来查找行的参考 删除然后我从 table3 和 table1.

中删除 0

脚本如下所示

DELETE FROM table3 t3
        INNER JOIN table1 t1 ON t3.t1ID = t1.t1ID
        INNER JOIN table2 t2 i ON t2.t1ID = t1.t1ID
        WHERE t3.t1ID IN(
         SELECT DISTINCT t1.t1ID            
                    FROM t2     
                        WHERE (
                              (t2.t2ID IS NULL AND t1.LastDate <@UpDate ))) 

上面删除0因为我在从

删除之前删除了table2
DELETE 
        FROM table2 t2 
         INNER JOIN table1 t1 on t2.T1ID =t1.t1ID 
         WHERE t2.t1ID IN(
         SELECT DISTINCT t1.T1ID            
                    FROM t2                 
                        WHERE (
                              (t2.t2ID is null and t1.LastDate <@UpDate <@UpDate )))

它也不会从 table1 中删除,因为脚本会查找 table2

中不存在的位置
DELETE 
        FROM table1 t1
        INNER JOIN table2 t2 i ON t2.t1ID = t1.t1ID
        WHERE t1.t1ID IN(
         SELECT DISTINCT t1.t1ID        
                    FROM t2 
                        WHERE (
                              (t2.t2 IS NULL ANDt1.LastDate <@UpDate)))

尝试这样的事情:

DECLARE @RowsToDelete TABLE
(
    RowsToDeleteID int IDENTITY(1,1) PRIMARY KEY,
    Table1ID int,
    Table2ID int,
    Table3ID int
);

INSERT @RowsToDelete (Table1ID, Table2ID, Table3ID)
SELECT DISTINCT t1.t1ID, t2.t2ID, t3.t3ID 
FROM table3 AS t3
INNER JOIN table1 AS t1 
ON t3.t1ID = t1.t1ID
INNER JOIN table2 AS t2 
ON t2.t1ID = t1.t1ID
WHERE t2.t2ID IS NULL 
AND t1.LastDate < @UpDate;

DELETE table2
WHERE EXISTS (SELECT 1 FROM @RowsToDelete AS rtd WHERE rtd.Table2ID = t2ID);

DELETE table1
WHERE EXISTS (SELECT 1 FROM @RowsToDelete AS rtd WHERE rtd.Table1ID = t1ID);

DELETE table3
WHERE EXISTS (SELECT 1 FROM @RowsToDelete AS rtd WHERE rtd.Table3ID = t3ID);

还没有表格等来尝试,但看起来应该没问题。

我还假设在您执行此操作时这些行可能不会更改,否则您有潜在的竞争条件。