none
Dele com INNER JOIN RRS feed

  • 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!

    segunda-feira, 23 de novembro de 2015 02:08

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. */

    segunda-feira, 23 de novembro de 2015 10:31

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. */

    segunda-feira, 23 de novembro de 2015 10:31
  • Olá Logan,

    obrigado por responder!

    Estou usando MySql! Eu não conheço essa forma de delete, batches.

    segunda-feira, 23 de novembro de 2015 10:44
  • 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. */


    segunda-feira, 23 de novembro de 2015 11:06
  • Achei mais simples! Só não entendi se esses blocos ficam na mesma sintax Sql.
    segunda-feira, 23 de novembro de 2015 11:44
  • 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. */

    segunda-feira, 23 de novembro de 2015 11:50
  • Então! Tentei executar todos e não deu. Estou estudando outra forma.
    • Editado igorlorosae segunda-feira, 23 de novembro de 2015 12:09
    segunda-feira, 23 de novembro de 2015 11:52
  • 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

    segunda-feira, 23 de novembro de 2015 13:05