[NEWSboard IBMi Forum]

Thema: SQL update

  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    1.973

    SQL update

    Hallo zusammen,

    vereinfachtes Bsp.
    3 Dateien

    select case when a.f1='J' then sum(a.f2) else sum(b.f2) end
    from a left outer join b on a.f3=b.f3
    left outer join c on c.f4=a.f4
    group by c.f4

    geht nicht, da a.f1 nicht im group ist
    Schade, würde er erst den select bilden und dann groupen würde es gehen.

    also so:
    with xx as (select c.F4, case when a.f1='J' then sum(a.f2) else sum(b.f2) end as sme
    from a left outer join b on a.f3=b.f3
    left outer join c on c.f4=a.f4
    group by a.f1, c.f4)
    select f4, sum(sme) from xx group by f4

    nun ist das Problem aber, das davor ein
    Update d set f5 =( ... muß.
    und das nicht geht.
    Wie krig ich den Update hin ohne eine echteTemp Datei zu schreiben

    In Worten
    in abh. eines Kennzeichens aus Datei A brauch ich die Summe eines Feldes von Datei A oder Datei B, gegroupt auf einer Info aus Datei C um damit Datei D zu aktualisieren.

    Danke
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    1.

    select sum(case when a.f1='J' then a.f2 else b.f2 end)
    from a left outer join b on a.f3=b.f3
    left outer join c on c.f4=a.f4

    Ggf. ist dieser Sum einfacher, da du a je Satz entscheiden muss.
    Da du nun keinen Schlüssel hast, kannst du auch keinen Group By machen.

    2.
    With ist im skalaren Subselect nicht erlaubt.
    Aber ggf. erledigt sich das ja auch durch den obigen Select.

    Dies wäre dann vielleicht so:

    update a
    set a.f5 = coalesce((select sum bla von oben.....), a.f5)
    where bla

    Zu bedenken ist noch, dass der skalare Select ja noch eine Beziehung zum Updatesatz herstellen sollte da sonst jeder das selbe bekommt, also

    set x.f5 = coalesce((select sum bla von oben..... where x.key = a.key), x.f5)
    where bla
    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
    Jun 2001
    Beiträge
    1.973
    Hallo und danke,
    Leider geht das nicht, ich habe einen Fehler in MEINEM Bsp oben.
    Ich brauche den Group.

    so ist das Bsp nötig
    Code:
    select c.f4, case when a.f1='J' then sum(a.f2) else sum(b.f2) end
    from a left outer join b on a.f3=b.f3
    left outer join c on c.f3=a.f3
    group by c.f4
    Ergebnis
    C.F4 Wert
    1 1000
    5 953
    20 52771
    ...

    noch ne Idee?

    mache (für den Update) z.zt 2 Läufe, einen auf a einen auf b


    oh, in deiner Version geht der Group, klappt also!! Danke
    Last edited by Robi; 02-04-19 at 09:25. Grund: es geht doch
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ggf. brauchst du den Group ja doch nicht?

    set x.f5 = coalesce((select sum bla von oben..... where x.f4 = a.f4), x.f5)
    where bla
    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

  5. #5
    Registriert seit
    Jun 2001
    Beiträge
    1.973
    nein, das Prob. ist, a.F4 gibt es nicht.
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... der Group by summiert (oder whatever) ein ResultSet und liefert ein ResultSet. Für den update mit subselect brauchst Du genau einen Satz, mit anderen Worten: die group by Felder wandern in die where clause des subselects und die group by clause fällt weg, da jetzt ja über alle summiert wird.

    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/

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Da hörst du Dieter.
    Ich hätte es einfacher gesagt: Ein skalarer Subselect darf nur 1 Feld und 1 Satz als Ergebnis liefern.
    Group by macht da keinen Sinn, da du dann nur die Gruppe liefern könntest und da gibts schnellere Wege.

    Aber es muss doch eine Beziehung des Group-By-Feldes zur Update-Datei geben?
    Oder schränkst du den Update noch zusätzlich ein?
    Was und wie klappt denn nun das, was du vorhast?
    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
    Jun 2001
    Beiträge
    1.973
    So habe ich es nun gemacht
    Code:
    update DATEI_D set d_wert =COALESCE((                               
                  SELECT SUM(CASE WHEN a.f1='J' then b.f2 else a.f2 end)
      FROM Datei_A a LEFT OUTER JOIN Datei_b b ON                       
                   a.k1 = b.k1 and a.k2 = b.k2 and ...                  
                     LEFT OUTER JOIN Datei_c c ON                       
                   a.k1 = c.k1 and ...                                  
     WHERE a.Fx = 1 and a.Fy  = 0    AND a.Fz = 0 and c.F4 = D.F4       
                    and a.Fxx = 2019 AND d.Fx= 201901                   
     GROUP BY c.F4                     ), 0)                            
    WHERE d.fx= 201901 AND d.fy =201901
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Das kann dann nur funktionieren, wenn c.F4 nur genau 1 Wert enthält und dann kannst du hier den Group by auch ebenso weglassen.
    Oder wie verlinkst (joinst) du da nun von Datei_D auf die Daten des Subselects, so dass nur 1 Wert für c.F4 vorkommt?
    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
    Jun 2001
    Beiträge
    1.973
    a oder b wird summiert
    a und b sind miteinander und mit c verknüpft

    a:c = n:1
    b:c = n:1
    a:b = 1:n

    d hat n Sätze mit c.f4 was aber durch die anderen Bedingungen zu einem 1:1 wird.

    Ob ich den Group weglassen kann?
    müsste ich mal versuchen, so finde ich es auf jeden Fall lesbarer

    Danke
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

Similar Threads

  1. Update RDi 9.1.1.1
    By andreaspr@aon.at in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 01-12-15, 11:28
  2. SQL Update
    By co_steffl in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 25-06-14, 15:17
  3. SQL update
    By Joe in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 15-04-03, 16:06
  4. SQL update
    By Joe in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 01-04-03, 20:50
  5. Update mit SQL
    By schreibr in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 12-09-01, 09:22

Berechtigungen

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