I need your guidance. I create a script to delete from 3 tables separately. meaning when I created the script is to delete from table3 (child) then delete from 2 (child), then delete from table1(parent) I am having problem with Table3 since table2 has foreign key both for table2 and table1 so I cannot delete it before I delete table2 and if I delete table2 first then I lose reference that I use to find the rows to be delete then I delete 0 from table3 and table1.
The script looks like following
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 )))
the above delete 0 since I delete table 2 before deleting from
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 )))
It does not delete from table1 either since the script looks up where does not exist in 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)))
Advertisement
Answer
Try something like this:
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);
Haven’t got the tables, etc. to try it but looks like it should be ok.
I’m also presuming here that those rows aren’t possibly changing while you’re doing this, otherwise you have potential race conditions.