Query com 3 Tabelas
12/06/2020
0
Tenho um banco de dados com 3 tabelas (Atendimento, Material e Taxa), criei uma query que busca informações das três tabelas, onde, existe atendimento que não gera Material e/ou Taxa, mas para gerar Material ou Taxa, é necessário ter um Atendimento. Essa query retornou apenas os dados que existem nas 3 tabelas, como faço para retornar os dados das 3 tabelas em apenas uma query independente de ter registro na tabela de Material e/ou Taxas?
Emerson
Post mais votado
12/06/2020
para o teu caso, utilize a tabela atendimento como tabela principal e relacione com as outras duas usando left join.
assim:
select * from Atendimento A left join Material M on M.campoquerelacionacomA = A.campousadopararelacionementocomM left join Taxa T on T.campoquerelacionacomA = A.campousadopararelacionementocomT [where .... ]
Emerson Nascimento
Mais Posts
12/06/2020
Ricardo Arraes
faltam detalhes sobre os relacionamentos e a cardinalidade.
Um atendimento pode ter mais de um material?
Um atendimento pode ter mais de uma taxa?
Um atendimento tem que ter um material E uma taxa? ou o atendimento pode não ter um deles?
Se possível, mande a query que você tentou executar para lhe ajudar melhor
12/06/2020
Ricardo Arraes
para o teu caso, utilize a tabela atendimento como tabela principal e relacione com as outras duas usando left join.
assim:
select * from Atendimento A left join Material M on M.campoquerelacionacomA = A.campousadopararelacionementocomM left join Taxa T on T.campoquerelacionacomA = A.campousadopararelacionementocomT [where .... ]
exatamente, mas isso depende muito do relacionamento entre as tabelas e da cardinalidade pra definir qual será a tabela principal e quais serão relacionadas através dos joins...
veja que se um atendimento possuir varios materiais ou varias taxas um left join não ajudaria e já que podem existir atendimentos sem material/taxa, um right join das tabelas material e taxa com a tabela atendimento sendo a principal também não serviria...
portanto é necessário entender o modelo que está sendo implementado antes de formular a query
15/06/2020
Emerson Nascimento
com isso conclui-se que sempre haverá um atendimento, podendo ou não haver taxas e/ou materiais.
15/06/2020
Ricardo Arraes
com isso conclui-se que sempre haverá um atendimento, podendo ou não haver taxas e/ou materiais.
De fato, isso está bem entendido. No entanto não sabemos qual o numero máximo de materiais/taxas que um atendimento pode ter (nem se os materiais/taxas podem ser repetidos dentro do atendimento, mas isso é menos relevante). Essa é a questão e pode mudar totalmente a construção da query
15/06/2020
Anderson Gonçalves
Você precisa pesquisar sobre o comando With que faz query dentro de query buscando resultados isolados para unir na sua busca.
Me procura que eu te ajudo:
Skype: anderson@case13.com.br
com isso conclui-se que sempre haverá um atendimento, podendo ou não haver taxas e/ou materiais.
De fato, isso está bem entendido. No entanto não sabemos qual o numero máximo de materiais/taxas que um atendimento pode ter (nem se os materiais/taxas podem ser repetidos dentro do atendimento, mas isso é menos relevante). Essa é a questão e pode mudar totalmente a construção da query
15/06/2020
Ricardo Arraes
Você precisa pesquisar sobre o comando With que faz query dentro de query buscando resultados isolados para unir na sua busca.
Me procura que eu te ajudo:
Skype: anderson@case13.com.br
com isso conclui-se que sempre haverá um atendimento, podendo ou não haver taxas e/ou materiais.
De fato, isso está bem entendido. No entanto não sabemos qual o numero máximo de materiais/taxas que um atendimento pode ter (nem se os materiais/taxas podem ser repetidos dentro do atendimento, mas isso é menos relevante). Essa é a questão e pode mudar totalmente a construção da query
Fala Anderson, beleza?
a dúvida não é minha, estou apenas ajudando, no entanto, o WITH clause a que você se refere varia de banco de dados para banco de dados.
Por exemplo, o MySql Server não proporciona essa clausula WITH, além do que é possível resolver a query do Emerson de forma mais simples usando uma das clausulas JOIN, basta saber os detalhes que mencionei acima...
15/06/2020
Emerson
para o teu caso, utilize a tabela atendimento como tabela principal e relacione com as outras duas usando left join.
assim:
select * from Atendimento A left join Material M on M.campoquerelacionacomA = A.campousadopararelacionementocomM left join Taxa T on T.campoquerelacionacomA = A.campousadopararelacionementocomT [where .... ]
Caros, agradeço a todos pelos direcionamentos/respostas, aproveitei dicas de todas as respostas e cheguei no objetivo que queria utilizando o Left Join, tive um pouco de dificuldade na base que estou trabalhando por causa de uma where enorme que eu tinha colocado na query mas, muitíssimo obrigado a todos.
Clique aqui para fazer login e interagir na Comunidade :)