Cenário:
Digamos que eu tenho duas tabelas, TableA e TableB. A chave primária da TabelaB é uma coluna única (BId) e é uma coluna de chave estrangeira na TabelaA.
Na minha situação, quero remover todas as linhas da Tabela A vinculadas a linhas específicas na Tabela B: Posso fazer isso por meio de junções? Excluir todas as linhas extraídas das junções?
DELETE FROM TableA
FROM
TableA a
INNER JOIN TableB b
ON b.BId = a.BId
AND [my filter condition]
Ou sou forçado a fazer isso:
DELETE FROM TableA
WHERE
BId IN (SELECT BId FROM TableB WHERE [my filter condition])
A razão pela qual pergunto é que me parece que a primeira opção seria muito mais eficiente ao lidar com tabelas maiores.
Obrigado!
DELETE TableA, TableB ...
e que realmente excluiu os registros relevantes de ambos. Agradável.DELETE from TableA a using TableB b where b.Bid = a.Bid and [my filter condition]
DELETE a FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid and [my filter condition]
Eu usaria essa sintaxe
fonte
Sim você pode. Exemplo:
fonte
Estava tentando fazer isso com um banco de dados de acesso e descobri que precisava usar um. * Logo após a exclusão.
fonte
É quase o mesmo no MySQL , mas você deve usar o alias da tabela logo após a palavra "DELETE":
fonte
A sintaxe acima não funciona no Interbase 2007. Em vez disso, tive que usar algo como:
(Nota: Interbase não suporta a palavra-chave AS para aliases)
fonte
Estou usando isso
e a maneira @TheTXI é boa o suficiente, mas leio respostas e comentários e descobri que uma coisa deve ser respondida é usar a condição na cláusula WHERE ou como condição de junção. Então, decidi testá-lo e escrever um trecho, mas não encontrei uma diferença significativa entre eles. Você pode ver o script sql aqui e o ponto importante é que eu preferi escrevê-lo como commnet, porque essa resposta não é exata, mas é grande e não pode ser colocada em comentários, por favor, me perdoe.
Se você puder obter um bom motivo desse script ou escrever outro útil, compartilhe. Obrigado e espero que isso ajude.
fonte
Digamos que você tenha 2 tabelas, uma com um conjunto mestre (por exemplo, funcionários) e outra com um conjunto filho (por exemplo, dependentes) e você deseja se livrar de todas as linhas de dados na tabela Dependents que não podem ser ativadas com quaisquer linhas na tabela mestre.
O ponto a ser observado aqui é que você está apenas coletando uma 'matriz' de EmpIDs da junção primeiro, usando esse conjunto de EmpIDs para executar uma operação de Exclusão na tabela Dependents.
fonte
No SQLite, a única coisa que funciona é algo semelhante à resposta do beauXjames.
Parece que tudo se resume a isso
DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
e que alguma tabela temporária pode ser criada por SELECT e JOIN na sua tabela de dois. É possível filtrar essa tabela temporária com base na condição em que você deseja excluir os registros da Tabela1.fonte
você pode executar esta consulta: -
fonte
A maneira mais simples é:
fonte
Minimize o uso de consultas DML com associações. Você deve conseguir fazer quase todas as consultas DML com subconsultas como acima.
Em geral, as junções devem ser usadas apenas quando você precisar SELECT ou GROUP por colunas em 2 ou mais tabelas. Se você estiver tocando apenas em várias tabelas para definir uma população, use subconsultas. Para consultas DELETE, use subconsulta correlacionada.
fonte