Eu tenho quatro tabelas - A, B, C e D.
A Tabela A contém registros de movimentação de estoque, a tabela B contém registros de vendas por item, a tabela C contém registros de não vendas por item e a tabela C contém o tipo de movimento de não venda.
Para cada registro em A, há uma linha em B ou uma linha em C. Portanto, para obter uma única linha dos movimentos de cada item, faço o seguinte:
select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C on C.Id = A.IdIntoC
Até agora tudo bem. Porém, como preciso saber que tipo de movimento foi em C como quero retornar o seguinte:
ItemId, Date, Sales, Goods In, Returns to Supplier
ou seja, ter colunas separadas para mercadoria recebida e devolvida a um fornecedor.
O tipo (bens recebidos ou devolvidos ao fornecedor) é armazenado em D e existe uma relação de muitos para um entre C e D, pois D é o "documento" que agrupa os itens em C.
Se eu fizer:
select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C as C1 on C1.Id = A.IdIntoC
left join D on D.Id = C1.IdIntoD and D.Type = 1
left join C as C2 on C2.Id = A.IdIntoC
left join D on D.Id = C2.IdIntoD and D.Type = 2
Acabei de obter linhas duplicadas, pois as duas junções de A a C são efetivamente as mesmas.
O que eu quero fazer é isso (sintaxe não legal):
select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C as C1 on C1.Id = A.IdIntoC and D.Type = 1
left join D on D.Id = C1.IdIntoD
left join C as C2 on C2.Id = A.IdIntoC and D.Type = 2
left join D on D.Id = C2.IdIntoD
Basicamente, quero separar as junções entre A e C com base em um valor em D. Sei que tenho que usar a left join
entre C e D todas as vezes, caso contrário, não obterei dados, mas logicamente é isso que sinto que preciso fazer .
Como eu faço isso?
Eu não acho que você precisa entrar na
C
mesa duas vezes. Isso funcionaria:O
(D.Type = 1 OR D.Type = 2)
pode ser ainda mais simplificado paraD.Type in (1, 2)
.Se você deseja 2 junções para
C
(eD
), você pode alterar a sintaxe em sua penúltima consulta para (fazer umainner
junção paraD
) e mover a condição de junção para o final:ou mais simples, junte-se
C
uma eD
duas vezes: