Query com 3 Tabelas

SQL

PostgreSQL

12/06/2020

Olá, esta é minha primeira publicação aqui, então, toda ajuda é bem vinda.

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

Emerson

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

12/06/2020

sempre que tiver esse tipo de dúvida, publique a tua tentativa. isto facilita receber ajuda.

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
   ....
]
GOSTEI 1

Mais Respostas

Ricardo Arraes

Ricardo Arraes

12/06/2020

Fala Emerson,

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
GOSTEI 0
Ricardo Arraes

Ricardo Arraes

12/06/2020

sempre que tiver esse tipo de dúvida, publique a tua tentativa. isto facilita receber ajuda.

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
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

12/06/2020

Ricardo Arraes, olhe o que foi publicado pelo meu xará:
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

com isso conclui-se que sempre haverá um atendimento, podendo ou não haver taxas e/ou materiais.
GOSTEI 0
Ricardo Arraes

Ricardo Arraes

12/06/2020

Ricardo Arraes, olhe o que foi publicado pelo meu xará:
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

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
GOSTEI 0
Anderson Gonçalves

Anderson Gonçalves

12/06/2020

Ricardo,

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

Ricardo Arraes, olhe o que foi publicado pelo meu xará:
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

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
GOSTEI 1
Ricardo Arraes

Ricardo Arraes

12/06/2020

Ricardo,

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

Ricardo Arraes, olhe o que foi publicado pelo meu xará:
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

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...
GOSTEI 0
Emerson

Emerson

12/06/2020

sempre que tiver esse tipo de dúvida, publique a tua tentativa. isto facilita receber ajuda.

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.
GOSTEI 1
POSTAR