Join esterno o query dinamica, che è il modo migliore per andare?
-
18-09-2019 - |
Domanda
Ho le seguenti tabelle (ho semplificato i dati contenuti nelle tabelle).
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
Il RateExtra contiene solo 3 valori con chiave di 1, 2 e 3 e supplemento carburante nomi, commissione di gestione e GST.
Questo bene sta lavorando per il suo scopo attuale. Un elenco di valori viene visualizzato con i record corrispondenti e la RateExtra viene interrogato solo per il rate_extra_name.
Quindi, io possa avere i seguenti risultati:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable2, 3, PetrolSurcharge
- Ratetable4, 4, GST
- Ratetable6, 5, PetrolSurcharge
Mi è stato chiesto di modificare questo in modo che ogni record che restituisce ora include registrazioni per ogni valore nella tabella RateExtra. Se non ci sono record che soddisfa quindi i dati dal mio tavolo RateTableExtra dovrebbero tornare come NULL. Così i miei dati dovrebbero tornare come:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable1, NULL, GST
- Ratetable2, 3, PetrolSurcharge
- Ratetable2, NULL, ManagementFee
- Ratetable2, NULL, GST
- Ratetable4, NULL, PetrolSurcharge
- Ratetable4, NULL, ManagementFee
- Ratetable4, 4, GST
- Ratetable6, 5, PetrolSurcharge
- Ratetable6, NULL, ManagementFee
- Ratetable6, NULL, GST
Ho provato ESTERNO unisce ma non sembra funzionare sto assumendo perché i dati RateExtra è legata al RateTableExtra che sarebbe restituire null. Ora sto pensando di creare una query dinamica in grado di ottenere il mio set di risultati originali, scorrere su di esso il controllo per rate_extra_id e, se non è già presente nel gruppo di risultati, aggiungendo una nuova riga per i risultati con i dati NULL in cui ho bisogno. Sto assumendo questo avrebbe funzionato, ma ho avuto la sensazione che sarebbe stato un killer sulle prestazioni.
C'è un modo migliore per fare questo? Spero che qualcuno possa aiutare, sarebbe molto apprezzato.
Soluzione
Prova questo:
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
Quello che stai ottenendo con questa query è, essenzialmente, un cartesiano join tra RateTable
e RateExtra
, con un left join
per trovare i valori di RateTableExtra
che corrispondono a quelle coppie. In sostanza, questa query sta riportando tutti i possibili combinazioni di RateTable
e RateExtra
, e che vi mostra quali avete nella vostra tabella di RateTableExtra
rapidamente.
Fate attenzione con cartesiana entra a far parte. Essi possono sfuggire di mano molto rapidamente con le tabelle di dimensioni ragionevoli! Buon divertimento!