Outer-Joins oder dynamische Abfrage, das ist der beste Weg zu gehen?
-
18-09-2019 - |
Frage
ich die folgenden Tabellen haben (ich die Daten in den Tabellen enthalten vereinfacht haben).
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
Die RateExtra enthält nur 3 Werte mit Schlüssel des 1, 2 & 3 und Benzinzuschlag Namen, Verwaltungsgebühr und GST.
Dies funktioniert gut für seine aktuelle Aufgabe. Eine Liste von Werten wird mit dem passenden Datensatz angezeigt und die RateExtra wird nur für die rate_extra_name abgefragt.
Also ich kann die folgenden Ergebnisse haben:
- Ratetable1, 1, PetrolSurcharge
- Ratetable1, 2, ManagementFee
- Ratetable2, 3, PetrolSurcharge
- Ratetable4, 4, GST
- Ratetable6, 5, PetrolSurcharge
Ich bin gebeten worden, dies zu ändern, so dass jeder Datensatz, der jetzt gibt Datensätze für jeden Wert in der RateExtra Tabelle enthält. Wenn es sollten keine passenden Datensätze dann Daten von meinem RateTableExtra Tisch zurück, als NULL kommen. So sollen meine Daten zurückkommen, wie:
- 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
Ich habe versucht, Outer-Joins, aber sie scheinen nicht Ich gehe davon aus, weil die RateExtra Daten an die RateTableExtra zu arbeiten verknüpft ist, die null zurückkehren würde. Ich erwäge jetzt eine dynamische Abfrage erstellen, die meine ursprüngliche Ergebnismenge erhalten werden, durchlaufen sie für rate_extra_id prüfen und, wenn sie nicht bereits in der Ergebnismenge ist, um eine neue Zeile zu den Ergebnissen mit NULL-Daten anhängen, wo ich es brauche. Ich gehe davon aus dem funktionieren würde, aber ich habe das Gefühl, es ist ein Killer auf der Leistung sein würde.
Gibt es einen besseren Weg, dies zu tun? Hoffe, dass jemand helfen kann, wäre es wirklich geschätzt.
Lösung
Versuchen Sie folgendes:
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
Was Sie mit dieser Abfrage erhalten ist, im Wesentlichen, sich einer cartesianischen zwischen RateTable
und RateExtra
mit einem left join
die Werte von RateTableExtra
zu finden, die diese Paare entsprechen. Im Wesentlichen diese Abfrage bringt zurück möglich Kombinationen von RateTable
und RateExtra
, und zeigt Ihnen, welche Sie in Ihrem RateTableExtra
Tabelle schnell haben.
Seien Sie vorsichtig mit cartesianischen Joins. Sie können mit recht großen Tabellen sehr schnell aus der Hand! Genießen Sie!