Gostaria de conseguir algo que provavelmente acabe em algum tipo de select condicional (MS SQL) mas não sei como fazer.
Eu tentei simplificar meu problema para a descrição abaixo:
Tenho 3 tabelas: 1 contendo Artigos (Art_number, Art_description e Productgroup), a segunda com Clientes (Cust_number e Cust_name) e uma terceira tabela contendo informações de desconto (Cust_number, Productgroup e Discount_percentage)
Tabela: Artigos
001,fork,cutlery
002,knife,cutlery
003,plate,tableware
004,cup,tableware
Tabela: Cliente
1234,smith
5678,jones
Tabela: Descontos
1234,cutlery,0.9
1234,tableware,0.8
5678,cutlery,0.75
5678,tableware,0.7
Minhas perguntas são sobre a relação com uma 4ª tabela que contém alguns (não todos!) Números de artigos alternativos (relacionados ao cliente) chamados Cross_Ref que ligam as duas primeiras tabelas contendo um número de artigo e um número de cliente (Art_number, Alt_Art_Nr e Customer_Nr)
Tabela: Cross_Ref
002,1002,1234
002,92002,5678
004,1004,1234
004,92004,5678
Eu gostaria de produzir uma tabela que mostre os números dos artigos na primeira coluna, a descrição do artigo na segunda coluna. Os números alternativos do artigo na terceira coluna (se disponível, caso contrário, vazio) e o nome do cliente na quarta coluna
Deve ficar assim com as informações acima:
001,fork,,smith
001,fork,,jones
002,knife,1002,smith
002,knife,92002,jones
003,plate,,smith
003,plate,,jones
004,cup,1004,smith
004,cup,92004,jones
Minha consulta atualmente se parece com isso:
SELECT Art_number, Art_description, Alt_Art_Nr, Cust_name
FROM Articles,
Customer,
Cross_Ref
WHERE Articles.Art_number = Cross_Ref.Art_number
and Customer.Cust_number = Cross_Ref.Customer_Nr
and Customer.Cust_number = Discounts.Cust_number
and Articles.Productgroup = Discounts.Productgroup
Isso só me mostra aquelas linhas que de fato possuem um número de artigo alternativo, mas não mostra os artigos que não possuem uma referência mencionada na tabela Cross_Ref.
Em princípio, é uma combinação de 4 tabelas totalmente conectadas por 3 tabelas, mas a 4ª tabela contém apenas um número de artigos (que possuem um número alternativo) e, portanto, resulta apenas nesses números de artigo no resultado da consulta, enquanto eu gostaria de ver todos os números de artigo e campos vazios (NULL), se não houver resultado.
Alguém pode me mostrar um exemplo de como arquivar isso?
Você provavelmente está procurando um OUTER JOIN em vez dos INNER JOINs implícitos que está usando. por exemplo, suponha
Em seguida, para obter uma lista de todos os funcionários e suas funções, você usaria
Daria
Com base na saída, acho que você precisa de uma consulta do tipo:
Sem mais informações para a
Discount
tabela, não podemos ter certeza, mas(Base)
provavelmente deveria ser (o produto cartesiano das duas tabelas):ou (uma junção usando outra tabela intermediária, ou seja):
Portanto, a consulta final deve ser semelhante a:
ou: