[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2019
    Beiträge
    53

    SQL Update Werte aus 2 Tabellen?

    Hallo Forum,

    Ich habe folgendes SQL:

    Ich würde gerne 3 Felder aktualisieren. 2 der Felder sind in test1 ​n und ein Feld ist in der Tabelle test2 ​ Gibt es eine Möglichkeit ein Update auf 2 Tabellen zu machen? Ich habe es mit einem join probiert hat aber leider nicht so funktioniert. Der Wert dem ich dem Feld aus der zweiten Tabelle vergeben will sollte konstant sein.

    Ich stehe gerade etwas auf dem Schlauch und weiß nicht weiter. Evt. hat einer von euch einen Ansatz.

    Code:
    UPDATE test1 t1 (t1.field, 
                               t1.field,
                               t2.field = 5)
    Code:
     UPDATE test1 t1
                          SET (t1.field, 
                               t1.field,
                               t2.field) =
                            (SELECT test,
                                    test,
                                    test                                                    
                             FROM table(test_function(
                             02172,
                             'TEST',
                             date('2021-07-26'),
                             'TEST',
                             5455612)
                             ) 
                             join  test2 t2 on t2.id    = t1.id 
                             where t1.test              = test
                             and   t1.test              = test
                             );

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nein, das ist nicht möglich.
    Der Update erlaubt nur als Ziel eine Tabelle.

    Die Alternative ist eine neue Tabelle mit allen benötigten Felder und einem "Instead Of"-Trigger.
    Der Trigger wird beim Update aufgerufen und kann dann 2 andere Tabellen mit Einzelupdates updaten.

    Letztlich ist es aber dasselbe, da du 2 Updates auch selber kodieren kannst.
    Empfehlenswert ist da natürlich Journalisierg und Commit=*CHG, da die 2 Updates ja im Kontext unteilbar sein sollen und das geht nur mit Transaktionen (Commit).
    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
    Aug 2019
    Beiträge
    53
    Ok vielen dank @Fuerchau wie immer :-D Ich schau mir das mal mit dem Instead Of - Trigger an.
    Aber mit zwei Einzelupdates hätte ich ja immer noch folgendes Problem:
    Wie komme ich an die ID der akualisierten Zeile heran? Also ich aktualisiere eine oder mehrere Zeilen in der Tabelle T1 und will daraufhin die entsprechenden Zeilen in der T2 aktualisieren.

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Ein Instead Of Trigger kann nur auf eine SQL-View erstellt werden. Damit musst Du zuerst eine View erstellen und dann den Instead of Trigger ...

    Also ich würde das Ganze mit 2 unabhängigen Update-Statements erledigen.
    Oder Du schreibst Dir ein kleines Progrämmchen (oder Stored Procedürchen), das die erste Datei in einer Schleife liest und dann den Update in der ersten und im Anschluss in der zweiten Datei erledigt. ... das ist sowie so die sauberste Lösung. Falls ein "fauler" Satz dabei ist, können die übrigen Sätze noch upgedated werden. Ansonsten heißt es nur alles oder nichts.

    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
    Aug 2019
    Beiträge
    53
    @B.Hauser
    selbst in einem Programm hätte ich ja aber immer noch das Problem der ID´s welches zu aktualisieren gibt in der zweiten Tabelle. Also die Funktion liefert mir X Werte aus die dann aktualisiert werden in der 2 Tabelle. mit IDENTITY_VAL_LOCAL() würde ich ja aber auch immer nur die letzte ID bekommen die aktualisiert wurde?

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Identity_Val_Local ermittelt die letzte Id.
    Wenn Du eine Schleife baust, dann kannst Du doch vor dem Update die Indentity ermitteln und dann damit den zweiten Update machen.
    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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nun ja, es gibt da noch den:

    Select bla [into ...] from final table (update .....)
    Select bla [into ...] from final table (insert ....)

    Damit kannst du den Identity_Val_Local() vergesssen, da dieser
    a) nur auf die letzte Identity funktioniert, die z.B. durch Trigger verfälscht werden kann
    b) Du eine Identity-Column überhaupt erst mal haben musst.

    Der "Select ... from final table ()" muss als Ergebnis genau nur 1 Satz zurückgeben.
    Er liefert zusätzlich auch die Felder, die ggf. durch Default's oder Trigger ergänzt wurden.
    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. SQL verschiedene Werte zählen
    By Domeus in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 15-06-21, 16:37
  2. Antworten: 6
    Letzter Beitrag: 02-12-19, 14:32
  3. Sql Null Werte
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 26-07-17, 10:12
  4. Werte vergleichen
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 07-07-16, 22:35
  5. Performance Werte V5R4
    By KingofKning in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 07-07-14, 15:15

Berechtigungen

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