J'ai les tableaux suivants (j'ai simplifié les données contenues dans les tableaux).Jointure externe ou requête dynamique, quelle est la meilleure solution?
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
Le RateExtra ne contient que 3 valeurs avec de la touche 1, 2 & 3 et le supplément d'essence de noms, des frais de gestion et de la TPS.
Cela fonctionne très bien pour son but actuel. Une liste de valeurs est affichée avec les enregistrements correspondants et le RateExtra est interrogé uniquement pour le fichier rate_extra_name.
Je peut avoir les résultats suivants:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable2, 3, PetrolSurcharge
- Ratetable4, 4, TPS
- Ratetable6, 5, PetrolSurcharge
Jev On nous a demandé de modifier cela afin que chaque enregistrement qui retourne maintenant inclut des enregistrements pour chaque valeur dans la table RateExtra. S'il n'y a aucun enregistrement correspondant alors les données de ma table RateTableExtra devraient revenir comme NULL. Donc, mes données devraient revenir comme:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable1, NULL, TPS
- Ratetable2, 3, PetrolSurcharge
- Ratetable2, NULL, ManagementFee
- Ratetable2, NULL, TPS
- Ratetable4, NULL, PetrolSurcharge
- Ratetable4, NULL, ManagementFee
- Ratetable4, 4, TPS
- Ratetable6, 5, PetrolSurcharge
- Ratetable6, NULL, ManagementFee
- Ratetable6, NULL, TPS
J'ai essayé les jointures OUTER mais ils ne semblent pas fonctionner je suppose parce que les données RateExtra sont liées au RateTableExtra qui renverrait null. J'envisage maintenant de créer une requête dynamique qui obtiendra mon ensemble de résultats d'origine, de parcourir pour vérifier rate_extra_id et, si ce n'est pas déjà dans le resultset, d'ajouter une nouvelle ligne aux résultats avec des données NULL là où j'en ai besoin. Je suppose que cela fonctionnerait, mais j'ai l'impression que ce serait un tueur sur la performance.
Y a-t-il une meilleure façon de faire cela? J'espère que quelqu'un peut aider, ce serait vraiment apprécié.
Si vous rendez le RateTableExtra optionnel via une jointure de droite, vous devez également rendre le RateExtra optionnel via une jointure de droite. Cela n'a pas de sens d'inclure la raison d'un supplément quand il y a en fait, pas de frais supplémentaires. Jacob – TheJacobTaylor