[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2011
    Beiträge
    94

    SQL - Datensätze untereinander darstellen . (xmlserialize anders herum)

    Hallo,

    ich habe eine "schlechte" DB2 Datei. In einem Datensatz stehen 4 x 3 Felder die ich untereinander per SQL darstellen möchte. Siehe Bsp.

    Kdnr Ans1 Name1 Ort1 An2 Name2 Ort2 Ans3 Name3 Ort3
    110 10 Markus Muenchen 20 Juergen Koe¶ln 30 Peter Berlin
    Kdnr Ans Name Ort
    110 10 Markus Muenchen
    110 20 Juergen Koeln
    110 30 Peter Berling

    Gibt es da etwas in SQL.

    Gruss Olaf

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.973
    select f1, f2, f3, f4 from datei where ...
    union all
    select f1, f5, f6, f7 from datei where ...
    union all
    select ...

    order by 1
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Mar 2011
    Beiträge
    94
    Danke Robi für die schnelle Antwort.

  4. #4
    Registriert seit
    Oct 2019
    Beiträge
    16
    Das wäre auch ne Möglichkeit:

    with
    test_data(kdnr, ans1, name1, ort1, ans2, name2, ort2, ans3, name3, ort3) as (
    values
    (110, 10, 'Markus', 'München', 20, 'Jürgen', 'Köln', 30, 'Peter', 'Berlin'),
    (120, 20, 'Stefan', 'Augsburg', 0, '', '', 0, '', '')
    ),

    test_data_tab(kdnr, ans, name, ort) as (
    select
    tab_data.*
    from
    test_data

    cross join lateral(
    values
    (kdnr, ans1, name1, ort1),
    (kdnr, ans2, name2, ort2),
    (kdnr, ans3, name3, ort3)
    ) as tab_data(kdnr, ans, name, ort)
    where
    ans <> 0
    )

    select * from test_data_tab

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Dann mach mal deinen Crossjoin mit 1000 Zeilen, das ergibt 1 Millionen Zugriffe.
    Der Union macht da nur 4000 Zugriffe.

    Den "lateral" nehme ich häufig als Ersatz für skalare Subselects, wenn man mehr als 1 Feld benötigt und dies nicht per Join erledigt werden kann, z.B. mit "order by xxx desc fetch first 1 rows only".
    Funktioniert sehr gut bei einer terminierten Preisfindung.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Oct 2019
    Beiträge
    16
    Wieso das? Bei einem cross join lateral wird jede Zeile mit den Zeilen der jeweiligen Values List verbunden, damit gibt es also nur 1000 Zugriffe anstatt 4000.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ja, man muss sich nur mal das Konstrukt genauer ansehen:

    Code:
    values
              (kdnr, ans1, name1, ort1),
              (kdnr, ans2, name2, ort2),
              (kdnr, ans3, name3, ort3)
          ) as tab_data(kdnr, ans, name, ort)
    
    Ich habe lateral ähnlich gesehen wie beim Join mit einer anderen Tabelle.
    Hier bezieht sich Values() direkt auf die From-Table. Das hatte ich so genau nicht gesehen.
    Diese Variante kannte ich noch nicht, hilft mir aber nun auch bei anderen ähnlichen Konstrukten, da es in ERP's durchaus ähnliche Strukturen gibt.

    Da hier kein zusätzlicher Zugriff erfolgt, könnte diese Abfrage sogar schneller als der Union sein, da hier direkt verarbeitet werden kann und nicht erst alles gelesen werden muss.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ja, man muss sich nur mal das Konstrukt genauer ansehen:

    Code:
    values
              (kdnr, ans1, name1, ort1),
              (kdnr, ans2, name2, ort2),
              (kdnr, ans3, name3, ort3)
          ) as tab_data(kdnr, ans, name, ort)
    
    Ich habe lateral ähnlich gesehen wie beim Join mit einer anderen Tabelle.
    Hier bezieht sich Values() direkt auf die From-Table. Das hatte ich so genau nicht gesehen.
    Diese Variante kannte ich noch nicht, hilft mir aber nun auch bei anderen ähnlichen Konstrukten, da es in ERP's durchaus ähnliche Strukturen gibt.

    Da hier kein zusätzlicher Zugriff erfolgt, könnte diese Abfrage sogar schneller als der Union sein, da hier direkt verarbeitet werden kann und nicht erst alles gelesen werden muss.
    ... it depends on optimizer!
    Ein SQL Statement beschreibt (laut SQL Standard) ein ResultSet und keine Zugriffsmethode und das ist gerade der Vorteil gegenüber ISAM - was der Optimizer daraus macht, sagt dann etwas über die Qualität der Datenbank Implementierung aus.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    So, nun habe ich das mal selber mit XPPS-Tabellen ausprobiert. Da gibt es haufenweise Tabellen, die solche Strukturen haben.
    Laut Visual Explain wird für die Values-List kein IO benötigt und der nested loop join benötigt kaum messbare Zeit.
    Die Tabelle hat ca. 10 Mio Zeilen und die Ergebnisse kommen sauschnell.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Spoolname bei externer Printerfile anders benennen
    By hwalk in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 06-07-17, 12:54
  2. Probleme mit SQL und xmlserialize
    By Lesca in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 16-04-15, 08:25
  3. Bildschirmformat als Format oder Window darstellen
    By harkne in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 05-08-14, 22:47
  4. Antworten: 1
    Letzter Beitrag: 07-04-14, 14:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •