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.

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top