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

Zwei Tabellen per Select-Abfrage besser kombinieren

Dieses Thema im Forum "Oracle" wurde erstellt von Steve6, 9 August 2016.

  1. Steve6

    Steve6 Aktiver Benutzer

    Hallo,

    ich habe (für mich) ein Problem mit dem "verbinden" zweier Tabellen in Oracle.

    In meinem Anhang habe ich die vorgegebenen Tabellen und die Zieltabellen (TabelleD) aufgeführt.

    Tabelle A und Tabelle B habe ich.

    Durch eine einfache SELECT-Abfrage kann ich diese über TabelleA.ART_NR und TabelleB.ART_ONR verbinden. Dann erhalte ich TabelleC

    Ich möchte es aber gerne wie in TabelleD gezeigt aufgebaut haben, damit die Artikel nicht mehrfach auftauchen und die Tabelle kürzer wird usw.
    Meine Frage: Geht das mit Oracle-SQL-Hausmitteln (Oracle 11g R2)?

    Gruß, Steve
     

    Anhänge:

  2. akretschmer

    akretschmer Datenbank-Guru

    ausgehend von Deiner Tabelle C und mit PostgreSQL:

    Code:
    test=*# select * from tab_c;
     artikel |  a_text  |  a_einh  
    ---------+----------+----------
     art_a  | rot  | farbe
     art_a  | achteck  | form
     art_a  | groß  | groesse
     art_b  | metall  | material
     art_b  | sechseck | form
    (5 Zeilen)
    
    test=*# select artikel, array_to_string(array_agg(a_text) filter (where a_einh='farbe'),'') as farbe, array_to_string(array_agg(a_text) filter (where a_einh='form'),'') as form, array_to_string(array_agg(a_text) filter (where a_einh='groesse'),'') as groesse, array_to_string(array_agg(a_text) filter (where a_einh='material'),'') from tab_c group by artikel;
     artikel | farbe |  form  | groesse | array_to_string
    ---------+-------+----------+---------+-----------------
     art_a  | rot  | achteck  | groß  |
     art_b  |  | sechseck |  | metall
    (2 Zeilen)
    
    Könnte in Oraggle vielleicht recht ähnlich gehen.
     
  3. drdimitri

    drdimitri Datenbank-Guru

    Das geht über die pivot Funktion:

    Code:
    select * from
      (select artikel,art_nr,... FROM a,b where a.art_nr=b.art_onr)
    PIVOT
    (
      MIN(art_text)
      FOR art_ein
      IN('FARBE (84)','FORM(58)',...)
    )
    ORDER BY artikel
    
     
    akretschmer gefällt das.
  4. Steve6

    Steve6 Aktiver Benutzer

    Hallo und Danke für die Antworten.

    @akretschmer: Leider steigt Oracle bei dem Filter aus. Es gibt bestimmt noch vergleichbares bei Oracle aber die Pivot-Funktion funktioniert.

    @drdimitri: danke für den Tipp. Diese Funktion kannte ich noch nicht. Ich habe als Ergebnis allerdings immer den Artikel doppelt in der Liste. Da muss ich noch prüfen woran das liegt.

    Vielen Dank
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Hi,

    das

    Code:
    array_agg(a_text) filter (where a_einh='farbe')
    
    kann man auch umschreiben zu

    Code:
    array_agg(case ehen a_einh='farbe' then a_text else NULL end)
    
    das ist die 'klassische' Syntax, die auch weniger gute Datenbanken in der Regel verstehen. Das nur als Nachtrag.
     
  6. drdimitri

    drdimitri Datenbank-Guru

    array_agg ist in Oracle nicht implementiert. Ist im SQL 2011 Standard auch nur optional.

    Aus der Doku:
     
  7. akretschmer

    akretschmer Datenbank-Guru

    ah okay. Da scheitert Oracle also nicht nur am FILTER, sonder auch am ARRAY_AGG ;-)
     
  8. skyerjoe

    skyerjoe Aktiver Benutzer

    Ohne jetzt die ganz große Ahnung zu haben aber könnte sowas nicht auch mit dem Merge Command in Verbindung mit Pseudo-column gehen ?

    grüße skyerjoe
     
  9. skyerjoe

    skyerjoe Aktiver Benutzer

    In manchen Foren wird die "collect" funtkion als equivalent dazu angesehen ....

    Google doch einfach mal danach ein bißchen

    grüße skyerjoe
     
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