[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2002
    Beiträge
    19

    Question SQL mit Update + Join

    Hallo geschätzte SQL-Spezies !
    Wir möchten gerne Feld1 mit Feld2 in Datei A via SQL updaten, wobei das Feld2 gejoint aus Datei B stammt. Im MS Acces kein Problem. Auf der AS bin ich zu dusselig. Bitte um hilfreiche Hinweise.
    Danke
    Harald
    Harald Wallukat
    Am Grafacker 2
    40789 Monheim
    Telefon +49 2173 32503
    Mobile +49 171 4137771
    harald.wallukat@web.de

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

    Post

    update fileA
    set feld1 = (select feld2 from fileb where filea.key = fileb.key)
    where filea.key in (select fileb.key from fileb)

    Die where-Bedingung ist dann erforderlich, wenn filea mehr Schlüssel als fileb enthält, da sonst der 1. Subselect einen NULL-Wert liefert, falls der Schlüssel in fileb nicht vorhanden ist.

    Bei mehreren Schlüsselfeldern kann die jeweilige where-bedingung natürlich ergänzt werden.
    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
    Sep 2002
    Beiträge
    19
    Vielen Dank !
    Hat prima geklappt und der Fall wurde
    in den Tipps+Tricks notiert.
    Grüße
    Harald Wallukat
    Harald Wallukat
    Am Grafacker 2
    40789 Monheim
    Telefon +49 2173 32503
    Mobile +49 171 4137771
    harald.wallukat@web.de

  4. #4
    Registriert seit
    Aug 2006
    Beiträge
    2.074
    Hallo *all,

    ich bräuchte mal einen Denkanstoß.
    Ich habe wie der Vorredner auch eine Datei in der ich 3 Felder updaten will. Die Logik ist zwar klar, allein die Syntax bekomme ich gedanklich nicht hin.

    Das ist die Ausgangssituation:

    update x/ipdocim a set a.imbelj = 13,

    a.imbeld = '20' !! substr(digits(akkdt2), 1, 2)
    !! substr(digits(akkdt2), 3, 2) !! substr(digits(akkdt2), 5, 2),
    a.imadrn = akkto

    join xxx/ako01pf b on (a.imbeln = b.akanr and akkdt2 > 130101)
    where (IMBELN > 148125 and IMBELN < 148129
    and IMBELA = 'AS'
    and IMBELJ <> 13)

    Jetzt müßte ja das join in ein update a.imbeld = select ..... umgebaut werden.

    Für Hinweise dankbar.

    GG

  5. #5
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hallo GG,

    ohne das jetzt getestet zu haben, denke ich mal in etwa so
    PHP-Code:
    Update x/ipdocim a
    Set
    (a.imbelda.imadrn ) = 
        (
    Select '20' concat SubStr(Digits(b.akkdt2), 12
                     
    concat SubStr(Digits(b.akkdt2), 32)
                     
    concat SubStr(Digits(b.akkdt2), 52),
                 
    akkto
            from xxx
    /ako01pf b where a.imbeln b.akanr and b.akkdt2 130101)
    where imbeln between 148125 and 148129
      
    and imbela 'AS'
      
    and imbelj <> 13
      
    and imbeln in (Select akanr from xxx/ako01pf where akkdt2 130101
    Gruß
    Ronald

  6. #6
    Registriert seit
    Aug 2006
    Beiträge
    2.074
    Danke,
    das ist es. Hat jetzt nur noch ein paar Sekunden gedauert weil ich noch ein distinct unterbringen mußte.

  7. #7
    Registriert seit
    Aug 2006
    Beiträge
    2.074
    Tja leider doch nicht, ich weis nicht was er will, aber wenn ich das Statement loslasse, kommt er mir mit einem

    Nachrichten-ID . . . . : SQL0407 Bewertung . . . . . . : 30
    Nachrichtenart . . . . : Diagnose

    Nachricht . . . : Nullwerte für Spalte oder Variable IMBELD nicht zulässig.
    Ursache . . . . : Einer der folgenden Fehler ist aufgetreten: Spalte IMBELD
    ist eine Zielspalte in einer Anweisung UPDATE oder INSERT für Tabelle
    IPDOCIM in xx. Es wurde ein Nullwert festgelegt, um in dieser Spalte
    eingefügt oder aktualisiert zu werden, oder es wurde kein Wert für die
    Spalte in einer Anweisung INSERT angegeben und für die Spalte sind keine
    Nullwerte zulässig. Der Nullwert wurde mit der relativen Eintragsnummer 1
    in der Liste VALUES, SELECT oder in der SET-Klausel angegeben.
    -- Spalte IMBELD ist eine Zielspalte in einer Anweisung ALTER für Tabelle
    IPDOCIM in xx. Das Attribut der Spalte IMBELD darf nicht in NOT NULL
    geändert werden, da bereits ein Nullwert mit der Eintragsnummer 1 der Spalte
    vorhanden ist.
    -- Variable IMBELD ist eine Zielvariable in einer SQL-Prozedur, -Funktion

    wieder
    selbst wenn ich es in

    Update xx/ipdocim a
    Set(a.imbeld, a.imadrn, a.imbelj) =
    (Select '20130101',
    akkto, '13'
    from xxx/ako01pf b where a.imbeln = b.akanr and b.akkdt2 >
    130101)
    where imbeln between 140000 and 167399
    and imbela = 'AS'
    and imbelj <> 13
    ändere bekomme ich den Fehler.

    Was will er von mir?


    Ein normales select auf die Daten ergibt

    Beleg-ID: Belegdatum Beleg-ID: Adreßnummer KTO KDT2
    Belegnummer CCYYMMTT Nummernkreis-Jahr Ident Auft.
    nummer Datum
    148.127 2003.09.15 03 11.481 30047 13.04.19
    148.127 2003.09.15 03 11.481 30047 13.04.19
    148.127 2003.09.15 03 11.481 30047 13.04.19
    148.854 2003.09.22 03 6.092 29435 13.04.30
    148.854 2003.09.22 03 6.092 29435 13.04.30
    148.854 2003.09.22 03 6.092 29435 13.04.30
    148.854 2003.09.22 03 6.092 29435 13.04.30
    149.267 2003.09.16 03 11.451 7097 13.05.06
    149.331 2003.09.16 03 11.571 4298 13.05.07
    149.352 2003.11.03 03 3.147 8672 13.05.07

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Du benötigst noch einen

    and exists (select * from ako01pf c where a.imbeln = c.akanr and c.akkdt2 >
    130101)

    Wenn nämlich kein Satz gefunden wird, liefert der Subselect NULL-Werte.
    Diese sind wohl in deiner Zieltabelle nicht zulässig.
    Anmerkung:
    Wenn NULL-Werte zulässig wären, hättest du die Inhalte für nicht existierende Daten auf NULL gesetzt!
    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

  9. #9
    Registriert seit
    Aug 2006
    Beiträge
    2.074
    Jo danke Dir,

    jetzt läuft der Sack aber wieder auf den Fehler das angeblich "Ergebnis der Anweisung enthält mehr als eine Zeile"
    obwohl ich ein dsitinct beim select gemacht habe.

    Da ja ein fetch first row in dem select nicht zulässig ist, würde ich es jetzt über eine Funktion machen wollen.

    Werde noch was tüfteln.....

    GG

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ein Subselect erlaubt auch Aggregate, vielleicht hilfts ja:
    from (select a, b, min(c) from myfile where ... group by a, b) 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

  11. #11
    Registriert seit
    Aug 2006
    Beiträge
    2.074
    Hallo *all,

    ich habe mir jetzt eine Funktion geschrieben die mir die Adresse ranholt die ich haben will. Dummerweise ist die Information >imbeln< in Datei 2 >ipdocim< die ich benötige um Datei 1 >ipdociv< upzudaten.

    Habe folgendes geschrieben.

    update ipdociv a
    set iivalu = akoname(imbeln) where
    iidoci in (select imdoci from ipdocim)

    Mir fällt auf Anhieb nicht ein wie ich das Update umbauen müßte.
    Geht das überhaupt oder muß man sich das was ganz anderes einfallen lassen?

    Für Hinweise dankbar.

    GG

Similar Threads

  1. SQL Update aus zwei Dateien mit 3 Schlüsselfeldern
    By mk in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 13-07-12, 09:53
  2. SQL left join
    By ahingerl in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 08-12-06, 09:28
  3. SQL - Join mit Bedingung und Update
    By cassi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 22-11-06, 16:03
  4. Update Syntax SQL
    By wuwu in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 18-07-06, 16:31
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 10:43

Berechtigungen

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