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

Verschachtelte Abfrage

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von JohnWorks, 9 März 2017.

  1. JohnWorks

    JohnWorks Benutzer

    Hallo Zusammen,

    ich habe eine Frage noch einer performance-orientierten Abfrage.

    Tabellenstruktur sieht wie folgt aus:
    > Jobdaten: Nr; Kunde; Bezeichnung; Preis
    Bsp:
    1, Musterkunde, TestBez, 16.99
    2, Musterkunde, Lala, 9.99

    > JobdatenDetails: NR; Detail; Value
    Bsp:
    1, Farbe, Rot
    1, Name, Max
    1, Datum, 01.01.2017
    2, Farbe, Gelb
    2, Name, Tom
    2, Datum, 01.01.2014

    Ich möchte eine Anfrage erstellen die nachfolgendes Ergebnis liefert:
    >AbfrageErgebnis: Jobdaten: Nr; Kunde; Bezeichnung; Preis; Farbe; Name; Datum
    Bsp:
    1, Musterkunde, TestBez, 16.99, Rot, Max,01.01.2017
    2, Musterkunde, Lala, 9.99, Gelb, Tom, 01.01.2014

    Wenn ich da ganze per Join mache. Habe ich es bisher immer nur hinbekommen einen Wert von JobdatenDetails darzustellen (bspw. Farbe). Ich bräuchte im Prinzip einen pivot von der Tabelle JobdatenDetails. Vielleicht hat ja jemand einen Tipp für mich.

    Lieben Dank,
    John
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du kannst Deine Jobdaten-Detailtabelle mehrfach joinen, Demo:

    Code:
    test=*# select * from job;
     id | name
    ----+------
      1 | max
      2 | anna
    (2 Zeilen)
    
    test=*# select * from detail ;
     j | detail |  value   
    ---+--------+----------
     1 | farbe  | rot
     1 | name  | Max
     1 | Datum  | 1.1.2017
     2 | farbe  | gelb
     2 | name  | Tom
     2 | Datum  | 1.1.2014
    (6 Zeilen)
    
    test=*# select * from job j left join detail f on (f.j,f.detail)=(j.id,'farbe') left join detail n on (n.j,n.detail)=(j.id,'name') left join detail d on (d.j,d.detail)=(j.id,'Datum');
     id | name | j | detail | value | j | detail | value | j | detail |  value   
    ----+------+---+--------+-------+---+--------+-------+---+--------+----------
      1 | max  | 1 | farbe  | rot  | 1 | name  | Max  | 1 | Datum  | 1.1.2017
      2 | anna | 2 | farbe  | gelb  | 2 | name  | Tom  | 2 | Datum  | 1.1.2014
    (2 Zeilen)
    
     
  3. ukulele

    ukulele Datenbank-Guru

    Du brauchst einfach nur mehr Joins mit Alias:
    Code:
    SELECT j.*,d1.value AS farbe,d2.value AS [name],d3.value AS datum
    FROM jobdaten j
    LEFT JOIN jobdatendetails d1
    ON j.nr = d1.nr
    AND d1.detail = 'Farbe'
    LEFT JOIN jobdatendetails d2
    ON j.nr = d2.nr
    AND d2.detail = 'Name'
    LEFT JOIN jobdatendetails d3
    ON j.nr = d1.nr
    AND d3.detail = 'Datum'
     
  4. JohnWorks

    JohnWorks Benutzer

    Vielen Dank für die Antwort mit den Joins.

    Das funktioniert nur, wenn bei den JobdatenDetails immer die selbe Reihenfolge in den Parametern vorhanden ist (Farbe, Name, Datum, Farbe, Name, Datum, Farbe, Name, Datum, ...).
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Nein.
     
  6. ukulele

    ukulele Datenbank-Guru

    Wie kommst du darauf? Datensätze in Tabellen haben zunächst mal gar keine Reihenfolge.
     
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