Quando il numero di righe non è troppo grande, l'approccio ricorsivo di erikkallen funziona.
Ecco un'alternativa che utilizza una tabella temporanea per raccogliere tutti i bambini:
create table #nodes (id int primary key)
insert into #nodes (id) values (@delete_id)
while @@rowcount > 0
insert into #nodes
select distinct child.id
from table child
inner join #nodes parent on child.parentid = parent.id
where child.id not in (select id from #nodes)
delete
from table
where id in (select id from #nodes)
Si inizia con la riga con @delete_id e discende da lì. L'affermazione in cui è di proteggere dalla ricorsione; se sei sicuro che non ce ne sono, puoi lasciarlo fuori.
Ho intenzione di provare che – markiz
Non sono così forte in sql. quindi ti chiedo: Perché hai bisogno: "seleziona id dalla tabella dove id = @delete_id" perché non puoi usare @delete_id come valore? – markiz
@markiz: buon punto, modifico la risposta! – Andomar