Usuário com melhor resposta
Dele com INNER JOIN

Pergunta
-
Olá,
estou deletando vários registros em várias tabelas (4 pra ser mais especifico) usando INNER JOIN.
Segue o código:
$smtp = $pdo->prepare('DELETE imob_clientes.*,imob_imoveis.*, imob_mailcliente.*, imob_tickets.* FROM imob_clientes
INNER JOIN imob_imoveis ON imob_clientes.clienteId = imob_imoveis.clienteId
INNER JOIN imob_mailcliente ON imob_clientes.clienteId = imob_mailcliente.clienteId
INNER JOIN imob_tickets ON imob_clientes.clienteId = imob_tickets.clienteId
WHERE imob_imoveis.clienteId = :clienteId AND
imob_mailcliente.clienteId = :clienteId AND
imob_tickets.clienteId = :clienteId');O problema é que se as tabelas estiverem com os campos preenchidos, tudo bem. Mas se alguma dessas tabelas estiver vazia, o sistema não deleta o cliente.
Alguém pode me ajudar?
Desde já, obrigado!
Respostas
-
Igor,
Você está fazendo isso no SQL Server? Até onde eu sei, isso não é uma sintaxe válida.
De qualquer modo, para apagar clientes que não tenham nenhum ticket, por exemplo, você precisa fazer um LEFT JOIN ao invés de um INNER JOIN.
Mas honestamente, eu faria os deletes em 4 batches separados, um para cada tabela.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Sugerido como Resposta Kanaãm Luz Romero Rodrigues segunda-feira, 23 de novembro de 2015 10:43
- Marcado como Resposta igorlorosae segunda-feira, 23 de novembro de 2015 13:05
Todas as Respostas
-
Igor,
Você está fazendo isso no SQL Server? Até onde eu sei, isso não é uma sintaxe válida.
De qualquer modo, para apagar clientes que não tenham nenhum ticket, por exemplo, você precisa fazer um LEFT JOIN ao invés de um INNER JOIN.
Mas honestamente, eu faria os deletes em 4 batches separados, um para cada tabela.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Sugerido como Resposta Kanaãm Luz Romero Rodrigues segunda-feira, 23 de novembro de 2015 10:43
- Marcado como Resposta igorlorosae segunda-feira, 23 de novembro de 2015 13:05
-
-
Igor,
Batches, na verdade, são blocos de código.
Ao invés de fazer esse delete com joins, sugeri fazer um
DELETE imob_clientes where clienteID = :clienteId; DELETE imob_imoveis where clienteID = :clienteId; DELETE imob_mailcliente where clienteID = :clienteId; DELETE imob_tickets where clienteID = :clienteId;
Me parece ficar mais simples. Você só vai precisar respeitar as FKs para apagar os registros na ordem correta.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Editado Logan Destefani Merazzi segunda-feira, 23 de novembro de 2015 11:06
- Sugerido como Resposta Poliana Dias segunda-feira, 23 de novembro de 2015 11:25
-
-
Igor,
Tem que ver se a forma como você está executando
"$smtp = $pdo->prepare(...."
suporta colocar todos os delete em uma única chamada. Se suportar, sim, faça tudo de uma vez.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */ -
Então! Tentei executar todos e não deu. Estou estudando outra forma.
- Editado igorlorosae segunda-feira, 23 de novembro de 2015 12:09
-
Consegui fazer! Olha como ficou:
$smtp = $pdo->prepare('DELETE imob_clientes.*,imob_imoveis.*, imob_mailcliente.*, imob_tickets.* FROM imob_clientes
LEFT OUTER JOIN imob_imoveis ON imob_clientes.clienteId = imob_imoveis.clienteId
LEFT OUTER JOIN imob_mailcliente ON imob_clientes.clienteId = imob_mailcliente.clienteId
LEFT OUTER JOIN imob_tickets ON imob_clientes.clienteId = imob_tickets.clienteId
WHERE (imob_clientes.clienteId = :clienteId) AND
(imob_imoveis.clienteId = :clienteId OR imob_imoveis.clienteId IS NULL) AND
(imob_mailcliente.clienteId = :clienteId OR imob_mailcliente.clienteId IS NULL) AND
(imob_tickets.clienteId = :clienteId OR imob_tickets.clienteId IS NULL)');Muito obrigado pela atenção Logan! vlw