[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    833

    SQL Update aus zwei Dateien mit 3 Schlüsselfeldern

    Hallo zusammen,

    ich weiß das wir das Thema schon öfter behandelt haben,
    aber nach langer Suche und Versuchen will es mir einfach
    nicht gelingen.

    Ich habe zwei Dateien mit gleichem Aufbau. Es soll ein
    UPDATE auf ein Feld von Datei 1 mit Wert aus Datei 2 erfolgen.

    In Datei zwei sind aber nicht alle Schlüsselkombinationen
    enthalten.

    update mk/lprm01p A set LVAL=
    ( select c.lval from mk/lprm01p c
    join mk/lprm01pold b
    on c.lpgm = b.lpgm
    and c.llnr = b.llnr
    and c.lent = b.lent )


    Die Aweisung bringt die Meldung
    Ergebnis der Anweisung enthält mehr als eine Zeile


    Kann mir vielleicht jemand auf die Sprünge helfen.

    Vielen DAnk

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Anhang:

    update ....
    )
    where a.key1 concat a.key2 ... in (select x.key1 concat x.key2 ... from datei x)
    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

  3. #3
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hallo Baldur,

    wenn ich dich richtig verstanden habe dann sollte es doch so aussehen


    update mk/lprm01p A set LVAL=
    ( select b.lval from mk/lprm01pold B
    join mk/lprm01p C
    on c.lpgm = b.lpgm
    and c.llnr = b.llnr
    and c.lent = b.lent )
    where a.lpgm concat a.llnr concat a.lent
    in (select b.lpgm concat b.llnr concat b.lent
    from mk/lprm01pold b)


    Damit kommt aber auch die Meldung
    Ergebnis der Anweisung enthält mehr als eine Zeile.



    Ich hab's einfach nicht mit SQL. Vielleicht sollte ich mir
    einkleines Pgmle schreiben.

    Gruss
    Michael

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo,

    versuch's mal mit der folgenden Syntax:
    PHP-Code:
    update MyTable2 A                                                 
           set 
    (A.Feld1A.Feld2) = (select Distinct B.Feld1B.Feld2          
                                       from Mytable1 B                
                                       where     A
    .Key1 B.Key1      
                                             
    and A.Key2 B.Key2
                                             
    and A.Key3 B.Key3)     
           
    where exists (select C.Key1C.Key2                        
                           from MyTable1 C                            
                           where     A
    .Key1 C.Key1                  
                                 
    and A.Key2 C.Key2
                                 
    and A.Key3 C.Key3
    Überigens die Lösung mit der IN-Anweisung und verketteten Feldern dürfte zu einer reichlich schlechten Performance führen, da der Optimizer für diesen SUB-Select keinen vorhandenen Zugriffs-Pfad verwenden kann, sondern einen Table Scan machen wird. Der Grund dafür liegt darin, dass durch das Verketten (Concat) ein neues Feld generiert wird, für das weder ein Zugriffs-Pfad vorhanden ist, noch angelegt werden kann.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Jan 2001
    Beiträge
    833
    Hallo Birgitta,

    das war des Rätsels Lösung.

    update mk/lprm01p A set a.LVAL=
    ( select distinct b.lval from mk/lprm01pold B
    where a.lpgm = b.lpgm
    and a.llnr = b.llnr
    and a.lent = b.lent )


    where exists
    (select c.lpgm , c.llnr, c.lent
    from mk/lprm01pold c
    where a.lpgm = c.lpgm
    and a.llnr = c.llnr
    and a.lent = c.lent )



    Vielen Dank euch beiden für die Hilfe

    und viele Grüße
    Michael

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das mit dem DISTINCT solltest du aber nicht so als Grundsatz verstehen, da du damit nur das Problem mehrerer Zeilen für genau diesen einen Fall ausschließt.

    Aufgrund der Where-Klausel kann es trotzdem zu mehreren Sätzen kommen, wenn die Beziehung nicht EINDEUTIG mit einer 1:1-Beziehung vorhanden ist.
    Deine Schlüssel vermuten da eher eine 1:N-Beziehung.
    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

  7. #7
    Registriert seit
    Jan 2001
    Beiträge
    833
    Nochmals DANKE

    Habe das ganze auch ohne Distinct laufen lassen,
    und es klappt.

    Gruss Michael

  8. #8
    Registriert seit
    Nov 2007
    Beiträge
    6

    Talking Respekt

    Also ich habe gedacht das ich gut bin was SQL angeht, aber DB2 hatte ich immer Schwierigkeiten, bin halt nen MS SQL Programer ;-)

    Aber wenn ich sowas lese muss ich echt sagen
    RESPEKT

    da kann selbst ich was lernen.

    schönen Tag

    Martin

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    MS SQL kann sowas aber auch.
    Es kommt da weniger auf die Syntax und Funktionen an sondern mehr auf den Lösungsansatz.
    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

  10. #10
    Registriert seit
    Nov 2007
    Beiträge
    6

    Wink MS Sql

    Das stimmt,
    aber am SQL Server würde ich das ganz anders machen

    in etwa so:

    UPDATE Tabelle A
    SET A.sdsd=B.sdsd, A.afaf=B.afaf
    FROM Tabelle A LEFT JOIN Tabelle2 B
    ON a.s = B.s and A.f = B.f and A.i =B.i
    WHERE ....

    so würde ich das da machen, und mache ich auch :-)

    bis dann
    Martin

  11. #11
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    UPDATE ... SET ... FROM ... ???

    Sachen gibts ...

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von MWendel Beitrag anzeigen
    Das stimmt,
    aber am SQL Server würde ich das ganz anders machen

    in etwa so:

    UPDATE Tabelle A
    SET A.sdsd=B.sdsd, A.afaf=B.afaf
    FROM Tabelle A LEFT JOIN Tabelle2 B
    ON a.s = B.s and A.f = B.f and A.i =B.i
    WHERE ....

    so würde ich das da machen, und mache ich auch :-)

    bis dann
    Martin
    Das funktioniert auf der DB2 for i?!
    Ich denke doch nicht, da es nicht SQL Standard ist.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. SQL Update über 3 Dateien
    By Bobou in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 22-11-06, 08:26
  2. SQL Update 2 Dateien
    By moskito in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 30-08-06, 17:30
  3. SQL UPDATE, verknüpfung zweier Dateien
    By desti82 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-07-06, 15:25
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. sql update mit 2 verknüpften dateien
    By juniorprog in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-02-06, 11:17

Berechtigungen

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