Teilmengen über SQL ermitteln

Andre_SQL

Neuer Benutzer
Beiträge
2
Hallo Zusammen,

ich bin seit heute neu in dem Forum und freue mich daher bereits jetzt auf den spannenden Austausch bei Fragen oder Problemen.

Leider komme ich direkt mit einem Problem. Ich habe Folgende Herausforderung auf einer Oracle DB.

1: Es wurde eine temporäre Tabelle erstellt, welche 118 Tarifnummern beinhaltet.
2: Die temporäre Tabelle muss nun mit drei weiteren Tabellen verknüpft werden, sodass als Ergebnis eine Liste mit Kunden erscheint, die diesen Tarif haben.
Dies ist erfolgt und es kommt als Ergebnis eine Menge von 135.587 Datensätzen heraus.

Nun komme ich zu meinem Problem:
Aus diesen 135.587 Kundensätzen, möchte ich nun pro Tarifnummer 5 Kundensätze selektieren. (Hintergrund der Aktion ist die Bereitstellung einer Testmatrix. Diese sollte natürlich nicht alle 135.587 beinhalten, sondern nur eine Teilmenge)

Als Ergebnis hätte ich dann also 5 (Kundensätze) x 118 (Tarifnummern) = 590 Datensätze

Mir fehlt nun allerdings die Idee, wie ich das in ein SQL verpacke. Nachfolgend befindet sich mein SQL, welches ich unter Punkt 2 erstellt habe.

select distinct kt.mandant,kt.kundennummer,tue.tarifnummer
From kundentabelle KT
inner join Tariftabelle TB on TB.kt_id = KT.id
inner join Tarifuebersetzung TUE on TUE.id = TB.tue_id
inner join itb_8839 on itb_8839.tarifnummer = TUE.tarifnummer

Der einzige SQL Befehl für Oracle wäre rownum der mir einfällt. Ich weis aber nicht wie ich diesen hier anwenden soll.

Über Rückmeldungen und Ideen würde ich mich freuen!

Viele Grüße
Andre
 
Werbung:
Sowas macht man normalerweise mit row_number():

Code:
select *
from (
  select kt.mandant, kt.kundennummer, tue.tarifnummer,
         row_number() over (partition by tue.tarifnummer order by ???) as rn
    From kundentabelle KT
      join Tariftabelle TB on TB.kt_id = KT.id
      join Tarifuebersetzung TUE on TUE.id = TB.tue_id
      join itb_8839 on itb_8839.tarifnummer = TUE.tarifnummer
) t
where rn <= 5;

Das DISTINCT in Deiner Abfrage ist häufig "code-smell". Vermutlich soll es die Duplikate entfernen die durch den JOIN entstehen. Meistens ist es effizienter den join durch ein WHERE EXISTS zu ersetzen, damit man die Duplikate gar nicht erst entfernen muss.
 
Werbung:
Hallo castorp,

ich bin begeistert über die schnelle und saubere Lösung. Habe es gerade schon aufgerufen und es funktioniert einwandfrei.

Deinen Rat bezüglich des DISTINCT werde ich mir merken.

Vielen Dank für die Hilfe!

Viele Grüße
Andre
 
Zurück
Oben