Tenho duas tabelas com uma relação muitos para um. Posso selecionar itens na tabela "filha" com um critério na tabela pai usando uma junção implícita:
select * from child,parent where child.parentid=parent.id and parent.name like 'foobar%'
Existe uma maneira melhor (mais eficiente, mais elegante) de excluir filhos que uma simples:
delete from child where child.parentid in (select id from parent where parent.name like 'foobar%')
Esta resposta sugere que eu poderia fazer:
delete child from child,parent where child.parentid=parent.id and parent.name like 'foobar%'
Mas no PostgreSql (por meio do SquirrelSQL) recebo um erro de sintaxe ... é claro que tenho nomes de tabela longos, então a solicitação real é mais parecida com:
delete c from child c, parent p where c.parentid=p.id and p.name like 'foobar%'
Então, isso é suportado pelo PG, ou existe outra maneira?
Pontos de bônus: posso excluir itens das duas tabelas usando:
delete from child,parent where child.parentid in (select id from parent where parent.name like 'foobar%')
Você pode excluir de ambas as tabelas em uma instrução usando um CTE de modificação de dados :
with deleted_parent as (
delete from parent
where name like 'foobar%'
returning id
)
delete from child
where id in (select id from deleted_parent)
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras