Usuário com melhor resposta
Ajuda com o comando JOIN

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
Respostas
-
Adolfo, dê uma olhada como montei essa query.
Code SnippetSELECT
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 dtcriaboletoFROM
tbl_sisabepsi_usuario uINNER JOIN tbl_sisabepsi_debito deb
ON u.id_usu = deb.id_usuINNER JOIN tbl_sisabepsi_boleto bol
ON u.id_usu = bol.id_usuINNER JOIN tbl_sisabepsi_valores val
ON bol.id_valores = val.id_valoresWHERE
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.
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
-
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_valoresAs 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
-
Adolfo, dê uma olhada como montei essa query.
Code SnippetSELECT
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 dtcriaboletoFROM
tbl_sisabepsi_usuario uINNER JOIN tbl_sisabepsi_debito deb
ON u.id_usu = deb.id_usuINNER JOIN tbl_sisabepsi_boleto bol
ON u.id_usu = bol.id_usuINNER JOIN tbl_sisabepsi_valores val
ON bol.id_valores = val.id_valoresWHERE
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. -
Olá Adolfo,
Agora sim ficou mais fácil... Veja se a consulta abaixo o ajuda.
Code SnippetSELECT
u
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 dtcriaboletoFROM
tbl_sisabepsi_usuario u
WHERE
u
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
-
-