none
Ajuda com o comando JOIN RRS feed

  • Pergunta

  •  

    Caros,

     

    Sou novo no SQL para não dizer em programação, preciso fazer uma query igual a esta que não traga valores duplicados, porque o comando executa infinitamente.

    Li que precisousar JOIN, mas confesso que não sei como usar join com várias tabelas, só vi com duas.

     

    SELECT u.id_usu 'Id',u.nome,bol.pago,bol.ref_transac, u.email,u.email_secundario,u.cpf, u.cnpj,u.rg,u.crp,u.sexo,u.instituicao,u.categoria, u.residencial,u.comercial,u.celular,u.logradouro,u.bairro,u.cep, u.cidade,u.estado, u.dt_criacao,bol.dt_pagamento, val.valor, bol.dt_criacao as dtcriaboleto

    FROM tbl_sisabepsi_usuario u ,tbl_sisabepsi_debito deb, tbl_sisabepsi_boleto bol, tbl_sisabepsi_valores val

    WHERE u.id_usu = deb.id_usu and u.categoria like '%ESTUDANTE%' AND deb.status = 'PAGO' AND u.estado like '%SP%' AND deb.id_valores in (0,4,5,6,7,8,9,10,11,12)

     

    Se alguem puder me ajudar .

     

    Obrigado,

    Adolfo

     

    segunda-feira, 19 de maio de 2008 14:32

Respostas

  • Adolfo, dê uma olhada como montei essa query.

    Code Snippet

    SELECT

    u.id_usu AS 'Id',
    u.nome,
    bol.pago,
    bol.ref_transac,
    u.email,
    u.email_secundario,
    u.cpf,
    u.cnpj,
    u.rg,
    u.crp,
    u.sexo,
    u.instituicao,
    u.categoria,
    u.residencial,
    u.comercial,
    u.celular,
    u.logradouro,
    u.bairro,
    u.cep,
    u.cidade,
    u.estado,
    u.dt_criacao,
    bol.dt_pagamento,
    val.valor,
    bol.dt_criacao AS dtcriaboleto

    FROM

    tbl_sisabepsi_usuario u

    INNER JOIN tbl_sisabepsi_debito deb

    ON u.id_usu = deb.id_usu

    INNER JOIN tbl_sisabepsi_boleto bol

    ON u.id_usu = bol.id_usu

    INNER JOIN tbl_sisabepsi_valores val

    ON bol.id_valores = val.id_valores

    WHERE

    u.categoria like '%ESTUDANTE%'
    AND deb.status = 'PAGO' AND u.estado like '%SP%'

    AND deb.id_valores in (0,4,5,6,7,8,9,10,11,12)


    Vi que vc fez as junções diretamente na cláusula WHERE (estava faltando algumas relações, conforme mencionado pelo Gustavo).
    Por questões de organização de código preferi fazer os JOINs de outra forma.
    Perceba que as relações são feitas com a utilização da sintaxe ON.
    Acredito que essa query atenderia a sua necessidade, mas é importante sempre estar atento às relações necessárias conforme o Gustavo mencionou.
    Estou lhe enviando o link de um artigo que fala justamente sobre JOINs, acredito que vale a pena você dar uma olhada.

    http://imasters.uol.com.br/artigo/6374/bancodedados/consultas_com_joins/


    []s.

    segunda-feira, 19 de maio de 2008 16:13

Todas as Respostas

  • Bom Dia,

     

    Acho que o problema não é só a existência de dados duplicados, mas talvez de dados incorretos.

     

    Observe que você utiliza quatro tabelas

     

    tbl_sisabepsi_usuario

    tbl_sisabepsi_debito

    tbl_sisabepsi_boleto bol

    tbl_sisabepsi_valores

     

    E veja que você usa apenas uma ligação

     

    u.id_usu = deb.id_usu

     

    Independente de usar JOINs ou cláusula WHERE, você precisa ter sempre N-1 ligações tal que N é o número de tabelas. Isso significa que se você relaciona 2 tabelas precisa ter uma ligação, se relaciona três tabelas, precisa ter duas ligações, se relaciona 4 tabelas precisa ter três ligações. Da forma como está, potencialmente seu resultado está não só duplicado como errado.

     

    Levante as ligações entre as tabelas e poderemos ajudá-lo com o JOIN

     

    [ ]s,

     

    Gustavo

    segunda-feira, 19 de maio de 2008 14:42
  • Oi Gustavo,

     

    Primeiramente obrigado pela atenção.

     

    Desculpe, mas vc tem razão na estrutura das tabelas, na verdade elas tem relação sim, veja:

     

    tbl_sisabepsi_usuario
    id_usu


    tbl_sisabepsi_debito
    id_usu


    tbl_sisabepsi_boleto bol
    id_usu
    id_valores


    tbl_sisabepsi_valores
    id_valores

     

    As 3 ligações das tabelas são o id_usu... que é o id do usuário no sistema.

     

    Agora complicou mais ainda, vc teria idéia de como eu deixaria a minha query?

     

    Obrigado,

    Desculpe as perguntas bestas é que eu ainda não sei muito.

     

    Adolfo

    segunda-feira, 19 de maio de 2008 15:11
  • Adolfo, dê uma olhada como montei essa query.

    Code Snippet

    SELECT

    u.id_usu AS 'Id',
    u.nome,
    bol.pago,
    bol.ref_transac,
    u.email,
    u.email_secundario,
    u.cpf,
    u.cnpj,
    u.rg,
    u.crp,
    u.sexo,
    u.instituicao,
    u.categoria,
    u.residencial,
    u.comercial,
    u.celular,
    u.logradouro,
    u.bairro,
    u.cep,
    u.cidade,
    u.estado,
    u.dt_criacao,
    bol.dt_pagamento,
    val.valor,
    bol.dt_criacao AS dtcriaboleto

    FROM

    tbl_sisabepsi_usuario u

    INNER JOIN tbl_sisabepsi_debito deb

    ON u.id_usu = deb.id_usu

    INNER JOIN tbl_sisabepsi_boleto bol

    ON u.id_usu = bol.id_usu

    INNER JOIN tbl_sisabepsi_valores val

    ON bol.id_valores = val.id_valores

    WHERE

    u.categoria like '%ESTUDANTE%'
    AND deb.status = 'PAGO' AND u.estado like '%SP%'

    AND deb.id_valores in (0,4,5,6,7,8,9,10,11,12)


    Vi que vc fez as junções diretamente na cláusula WHERE (estava faltando algumas relações, conforme mencionado pelo Gustavo).
    Por questões de organização de código preferi fazer os JOINs de outra forma.
    Perceba que as relações são feitas com a utilização da sintaxe ON.
    Acredito que essa query atenderia a sua necessidade, mas é importante sempre estar atento às relações necessárias conforme o Gustavo mencionou.
    Estou lhe enviando o link de um artigo que fala justamente sobre JOINs, acredito que vale a pena você dar uma olhada.

    http://imasters.uol.com.br/artigo/6374/bancodedados/consultas_com_joins/


    []s.

    segunda-feira, 19 de maio de 2008 16:13
  • Olá Adolfo,

     

    Agora sim ficou mais fácil... Veja se a consulta abaixo o ajuda.

     

    Code Snippet

    SELECT

    u.id_usu 'Id',u.nome,bol.pago,bol.ref_transac, u.email,u.email_secundario,

    u.cpf, u.cnpj,u.rg,u.crp,u.sexo,u.instituicao,u.categoria, u.residencial,

    u.comercial,u.celular,u.logradouro,u.bairro,u.cep, u.cidade,u.estado,

    u.dt_criacao,bol.dt_pagamento, val.valor, bol.dt_criacao as dtcriaboleto

    FROM

    tbl_sisabepsi_usuario u

    INNER JOIN tbl_sisabepsi_debito deb ON u.id_usu = deb.id_usu

    INNER JOIN tbl_sisabepsi_boleto bol ON u.id_usu = bol.id_usu

    INNER JOIN tbl_sisabepsi_valores val ON bol.id_valores = val.id_valores

    WHERE

    u.categoria like '%ESTUDANTE%' AND deb.status = 'PAGO' AND u.estado like '%SP%' AND deb.id_valores in (0,4,5,6,7,8,9,10,11,12)

     

     

    De fato suas perguntas podem parecer simples para muitos, mas qualquer um que mexa com SQL já teve suas dúvidas no passado. O importante é que elas sejam esclarescidas

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 19 de maio de 2008 16:18
  • Muito obrigado,

    Valeu mesmo.

    Adolfo

    segunda-feira, 19 de maio de 2008 16:35
  • Muito obrigado,

    Obrigado por tudo.

    Adolfo

     

    segunda-feira, 19 de maio de 2008 16:35