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

Knifflige verjointe Abfrage mit Stringfunktionen LISTAGG und Elliminierung doppelter Einträge

Dieses Thema im Forum "Oracle" wurde erstellt von atlantis, 26 Januar 2017.

  1. atlantis

    atlantis Benutzer

    Nachdem ich bei meiner ersten Anfrage sehr positiv von den Rückmeldungen überrascht wurde jetzt eine neue Denksportnuss...
    Ziel: 3 gejointe Tabellen unter Nutzung von LISTAGG.
    Problem: Ich möchte in der LISTAGG Liste keinen doppelten Einträge...


    Zur besseren Übersicht meien Spielwiese:
    Begriffe: TLN =Teilenummer; KAT_NR = Katalog Nummer;

    3 Tabellen

    TLN_ZU_BEZ

    PK TLN BEZEICHNUNG
    1 111111111 Hupe
    5 222222222 Tank
    6 333333333 Licht
    7 444444444 Bremse
    3 666666666 Bolzen
    2 777777777 Schraube
    4 888888888 Blinker
    8 999999999 Fenster

    TLN_ZU_KAT
    PK TLN KAT_NR
    1 111111111 1
    3 111111111 5
    2 111111111 2
    5 222222222 7
    4 222222222 1
    6 333333333 5
    7 444444444 1
    8 444444444 8
    12 666666666 9
    11 666666666 8
    13 777777777 3
    9 888888888 4
    10 999999999 2

    KAT_ZU_MOD
    KAT_NR MODELL
    1 A
    2 A
    5 B
    7 C
    10 C
    8 D
    9 D
    4 D
    6 E
    3 F

    Etappenziel 1 Teilenummer und zugehöriges MODELL anzeigen funktioniert schon mit:
    [code:/]
    select distinct
    TzB.TLN, LISTAGG(KzM.MODELL,', ') WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
    from TLN_ZU_BEZ TzB

    LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
    LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
    GROUP BY TzB.TLN

    liefert

    TLN KATALOGE
    111111111 A, A, B
    222222222 C, C
    333333333 B
    444444444 A, D
    666666666 D, D
    777777777 F
    888888888 D
    999999999 A

    Ab jetzt hänge ich in der Luft:
    Wunsch noch Bezeichnung in die Liste aufnehmen:

    [Code:]
    select distinct
    TzB.TLN, TzB.Bezeichnung, LISTAGG(KzM.MODELL,', ') WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
    from TLN_ZU_BEZ TzB
    LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
    LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
    GROUP BY TzB.TLN

    liefert Fehler: ORA-00979: Kein GROUP BY-Ausdruck
    Weiteres und für mich noch deutlich größeres Problem:
    Ich möchte in der Ergebnsiliste keine Doppelten Nennungen ( siehe grüne A/C)


    Ziel:
    TLN KATALOGE


    111111111 A, B
    222222222 C
    333333333 B
    444444444 A, D
    666666666 D
    777777777 F
    888888888 D
    999999999 A


    Hat jemand einen Hinweis, Link, Idee, Code .... ????
     
    Zuletzt bearbeitet: 26 Januar 2017
  2. drdimitri

    drdimitri Datenbank-Guru

    Hi,

    um die doppelte Einträge aus Kataloge herauszubekommen, musst du ein Subselect verwenden:
    Code:
    select listagg (modell...) from (select distinct modell, ..)
    Wegen dem GROUP BY: Du musst das Feld in die Group by Klausel aufnehmen.
     
  3. atlantis

    atlantis Benutzer

    Hallo drdimitri

    Mensch das ging ja flott. Das probiere ich gleich aus.

    Melde mich nach dem Testen...

    Danke
    Atlantis
     
  4. atlantis

    atlantis Benutzer

    Hallo Drmitri

    Erstes Thema (Bezeichnung einfügen) mit Deinem Rat problemlos gelöst:
    TzB.TLN, TzB.BEZEICHNUNG, LISTAGG(KzM.MODELL,', ') WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
    from TLN_ZU_BEZ TzB
    LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
    LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
    GROUP BY TzB.TLN, TzB.BEZEICHNUNG

    Mit dem Rest Deines Hinweises bin ich als Grünling noch etwas überfragt.
    Ich habe leider ein generelles Verständnisproblem beim Befehl LISTAGG.
    Habe es so probiert aber irgendwie ist mir da ein "from "zuviel an Bord...


    select distinct
    TzB.TLN,TzB.BEZEICHNUNG, select listagg (KzM.MODELL,', ') from (select distinct KzM.MODELL)
    WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
    from TLN_ZU_BEZ TzB

    LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
    LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
    GROUP BY TzB.TLN,TzB.BEZEICHNUNG

    Danke für einen weiteren kleinen Hinweis, oh großes Oracel...
    PS: Wie kann man hier im Forum den Code als Code markieren?

    Gruss

    Atlantis
     
  5. drdimitri

    drdimitri Datenbank-Guru

    Code:
    select 
    a.TLN,a.BEZEICHNUNG,  listagg (a.MODELL,', ') 
    WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
    from (
    select distinct TzB.TLN,TzB.BEZEICHNUNG,modell 
    TLN_ZU_BEZ TzB
    LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
    LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR) a
    Ohne Garantie auf Korrektheit ;)

    PS: Tabellennamen dürfen bis zu 30 Zeichen lang sein - nutze das ruhig aus.
    Code kannst mit {code} {/code} formatieren nur [ Klammern anstatt { verwenden.
     
  6. atlantis

    atlantis Benutzer

    Hey super !!!!
    Du hattest zwar noch ein paar kleine Tipfehler drin bzw. ein From und den Group By vergessen,
    aber ich habe es mir dann mit viel Try and Error voll zusammen reimen können.
    Dabei habe ich jetzt auch verstanden, wie der Construct funktioniert, nachdem anfangs nur mein Subselect funktioniert hatte...
    :cool:

    Falls das mal jemand nachgoogelt. Die Richtige lauffähige Lösung ist:
    Code:
    select
    a.TLN, a.BEZEICHNUNG,  listagg (a.MODELL,', ') WITHIN GROUP (ORDER BY a.MODELL) "KATALOGE"
    from
    (select distinct TzB.TLN,TzB.BEZEICHNUNG,KzM.MODELL
      from TLN_ZU_BEZ TzB
      LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN             = TzK.TLN
      LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR = KzM.KAT_NR
    ) a
    GROUP BY a.TLN,a.BEZEICHNUNG
    
    Vielen lieben Dank für Deine Hilfe !!!!
    Atlantis
     
    drdimitri gefällt das.
Die Seite wird geladen...
Ähnliche Themen - Knifflige verjointe Abfrage
  1. copy68
    Antworten:
    17
    Aufrufe:
    3.209
  2. Poleander
    Antworten:
    4
    Aufrufe:
    2.997

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