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.

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top