Junção externa ou consulta dinâmica, qual é o melhor caminho a percorrer?
-
18-09-2019 - |
Pergunta
Eu tenho as tabelas a seguir (simplifiquei os dados contidos nas tabelas).
RateTable
- rate_table_id [int]
- rate_table_name [nvarchar(50)]
RateTableUsed
- rate_used_id [int]
- rate_table_id [int] (key to RateTable.rate_table_id)
- customer_id [int]
RateTableExtra
- rate_table_extra_id [int]
- rate_ extra_id [int] (key to RateExtra.rate_table_id)
- rate_used_id [int] (key to RateTableUsed.rate_used_id)
RateExtra
- rate_ extra_id [int]
- rate_extra_name [nvarchar(50)]
select rate_table_name, rate_table_extra_id, rate_extra_name from RateTableUsed rtu
innerjoin RateTable rt on rtu.rate_table_id = rt.rate_table_id
innerjoin RateTableExtra rte on rte.rate_table_id = rt.rate_table_id
innerjoing RateExtr re on rte.rate_extra_id = re.rate_extra_id
O CATEEXTRA contém apenas 3 valores com a sobretaxa de gasolina 1, 2 e 3 da Key e Names, taxa de gerenciamento e GST.
Isso está funcionando bem para o seu objetivo atual. Uma lista de valores está sendo exibida com registros correspondentes e o TakeExtra é consultado apenas para o rate_extra_name.
Então, posso ter os seguintes resultados:
- Ratetable1, 1, gasolina
- Ratetable1, 2, Managementfee
- Ratetable2, 3, gasolina
- Ratetable4, 4, GST
- Ratetable6, 5, gasolina
Foi -me pedido para modificar isso para que cada registro que retorne agora inclua registros para cada valor na tabela de ratextra. Se não houver registros correspondentes, os dados da minha tabela RateTableExtra devem voltar como nulos. Então, meus dados devem voltar como:
- Ratetable1, 1, gasolina
- Ratetable1, 2, Managementfee
- Ratetable1, nulo, GST
- Ratetable2, 3, gasolina
- Ratetable2, null, gerenciamentofee
- Ratetable2, nulo, GST
- Ratetable4, nulo, gasolina
- Ratetable4, null, gerenciamentofee
- Ratetable4, 4, GST
- Ratetable6, 5, gasolina
- Ratetable6, null, gerenciamentofee
- Ratetable6, nulo, GST
Eu tentei junções externas, mas elas não parecem estar funcionando, estou assumindo porque os dados do RateExtra estão vinculados ao RateTableExtra, o que retornaria nulo. Agora estou pensando em criar uma consulta dinâmica que obtenha meu conjunto de resultados originais, itera sobre a verificação de rate_extra_id e, se ainda não estiver no ResultSet, anexando uma nova linha aos resultados com dados nulos onde eu preciso. Estou assumindo que isso funcionaria, mas tenho a sensação de que seria um assassino no desempenho.
Existe alguma maneira melhor de fazer isso? Espero que alguém possa ajudar, seria realmente apreciado.
Solução
Experimente isso:
select
rate_table_name,
rate_table_extra_id,
rate_extra
from
RateTableUsed rtu
inner join RateTable rt on
rtu.rate_table_id = rt.rate_table_id
cross join RateExtra re
left outer join RateTableExtra rte on
rte.rate_table_id = rt.rate_table_id
and rte.rate_extra_id = re.rate_extra_id
order by rt.rate_table_name, re.rate_extra_id
O que você está recebendo com esta consulta é essencialmente uma parte cartesiana entre RateTable
e RateExtra
, com um left join
Para encontrar os valores de RateTableExtra
que correspondem a esses pares. Essencialmente, esta consulta está trazendo de volta tudo possível Combinações de RateTable
e RateExtra
, e mostrando quais você tem em seu RateTableExtra
tabela rapidamente.
Cuidado com as juntas cartesianas. Eles podem sair do controle muito rapidamente com mesas de tamanho razoável! Apreciar!