1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Teilmengen über SQL ermitteln

Dieses Thema im Forum "Oracle" wurde erstellt von Andre_SQL, 15 April 2020.

  1. Andre_SQL

    Andre_SQL Neuer Benutzer

    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
     
  2. castorp

    castorp Datenbank-Guru

    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.
     
  3. Andre_SQL

    Andre_SQL Neuer Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden