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.

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top