Estou sendo solicitado a criar o que (a princípio) parecia ser uma consulta bastante simples/direta. No entanto, estou enfrentando alguns problemas causados pelas relações de link entre as tabelas que estão sendo consultadas. E a ampla gama de dados a serem incluídos no relatório de várias tabelas diferentes.
Este é um banco de dados postgresql que contém informações sobre cozinheiros que vendem alimentos. Simples o suficiente. O relatório solicitado consulta informações pessoais sobre os cozinheiros, seus menus disponíveis, itens alimentares nesses menus e a última vez que esse item foi comprado... dados que residem em 6-7 mesas diferentes.
Estou tendo muita dificuldade em juntar todas essas tabelas de uma maneira que retorne os dados de maneira aceitável. Aqui está uma visualização das tabelas com as quais estou trabalhando e seus relacionamentos de link:
Como você pode ver, tudo se origina e se vincula à entrada do usuário na tabela de contas. A partir daí, os vendedores têm uma entrada na tabela "loja", que liga a praticamente todo o resto:
- As tabelas 'store_address' e 'address' contêm informações de endereço.
- A tabela 'menu' contém os nomes dos menus - cada loja pode ter vários menus que oferecem determinados itens alimentares.
- A tabela kitchen_item contém todos os itens alimentares específicos disponíveis em cada um dos vários menus.
- A tabela 'menu_item' é o que é usado para vincular os itens de comida na mesa kitchen_item ao seu menu na mesa do menu.
- 'orders' rastreia as informações do pedido para cada item vendido
Então, estou tendo problemas para juntar todas essas tabelas corretamente. Preciso mostrar cada vendedor (tabela de contas), suas informações pessoais (tabela de endereços), seus menus disponíveis (tabela de menus), os itens em cada um desses menus (tabela itens_cozinha) e a data da última venda desse item (tabela de pedidos).
Quando eu simplesmente deixei juntar tudo, cada menu possível contém todos os itens de comida possíveis... Tentei uma combinação de junções esquerdas, junções direitas, junções completas, etc... mas acho que este pode estar um pouco acima do meu nível de habilidade. .. dado o layout dos relacionamentos.
Então, alguém faria a gentileza de demonstrar que essas tabelas podem ser unidas?
as junções:
select
account.id, account.email, account.firstname, account.lastname,
address.address, address.address_2, address.city, address.state,
menu.name,
kitchen_item.name,
orders.placed
from account
left join store on account.id = store.account_id
left join menu on store.id = menu.store_id
left join menu_item on menu.id = menu_item.menu_id
left join kitchen_item on (menu_item.kitchen_item_id = kitchen_item.id and store.id = kitchen_item.store_id)
left join orders on store.id = orders.store_id
join store_address on store.id = store.address.store_id
join address on store_address.address_id = address.id
group by table.value, table.value...
Quando executo a consulta com as tabelas unidas como acima, estão faltando entradas aleatórias ... e não tenho certeza do porquê.
Os dados são para um relatório. Tabular "tudo junto" ou dividido em áreas de assunto é bom - embora dividir em áreas de assunto possa parecer bom. O único requisito é uma coluna para cada ponto de dados.
A última parte que estou tentando realizar é juntar a tabela "orders" para obter a mais nova entrada única em orders.placed para cada linha/alimento já existente. Eu imagino que preciso escrever uma subconsulta?
Concordo completamente em dividir a consulta, embora esta seja estritamente a consulta que o indivíduo deseja. Eu acho que eles vão querer que eu implemente algum tipo de " case when rowcount() >1 = '' " para limpar todas as entradas duplicadas e transformá-las em espaço em branco.
Desde então, resolvi o problema específico no qual este post se concentrou (as junções) ... e passei para um novo conjunto de problemas com ele. Então, para manter o post no tópico, vou responder/fechar. Ninguém contestou a forma como acabei juntando as mesas ou sugeriu uma forma "mais correta" ou eficiente, então acho que o que tenho pode ser considerado correto para essa situação. Talvez alguém que chegue a esta página ache meu diagrama visual e as junções subsequentes úteis para visualizar/juntar suas próprias tabelas... quem sabe.
De qualquer forma, isso é o que funcionou para mim: