Nossos usuários finais têm muitas maneiras de enviar produtos para nossos clientes. Eles podem usar o endereço do cliente em uma tabela ( [customer]
), um endereço de entrega específico em outra ( [dropship]
) ou ainda outro endereço de entrega em outra tabela (para clientes com vários locais) ( [delivery]
). Todos eles têm aproximadamente a mesma estrutura, com os mesmos nomes de coluna para os mesmos pontos de dados (por exemplo [address]
, é o endereço em todas as tabelas).
Atualmente, nossa lógica para encontrar o endereço de entrega de um pedido é a seguinte:
SELECT
Address = COALESCE(r.address, d.address, c.address)
FROM [order] o
JOIN customer c
ON o.customerid = c.customerid
LEFT JOIN delivery d
ON o.customerid = d.customerid
AND o.delivaddressid = d.delivaddress
LEFT JOIN dropship r
ON o.orderid = r.orderid;
Com base em conversas e não em algumas postagens de blog , EXISTS
parece ser o preferido.
No entanto, este é um novo paradigma para mim e estou tentando entender isso. Acabei de substituir o LEFT JOIN
s por
WHERE EXISTS
(select 1 from delivery d
where o.customerid = d.customerid
and o.delivaddressid = d.delivaddress)
Isso não me permitirá usar os dados de [delivery]
, a menos que eu os jogue na FROM
cláusula e crie um produto cartesiano, certo?
Embora você possa usar
EXISTS
para determinar se, digamos, um endereço de dropship está presente, você não pode usá-lo para saber qual é o endereço real.EXISTS
não retorna nenhum dado. Para isso, você precisará do join.Um design melhor pode ser bem servido aqui, por exemplo, uma única
Addresses
tabela com um tipo. Mas, pelo que entendi, seu modelo não é flexível no momento.