[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2006
    Beiträge
    2.114

    SQL V5R4 update

    Hallo *all,
    in bin ja jetzt hingegangen und habe die Emial-Datei bereinigt das jede ID nur einmal vorhanden ist. Kann ich auch fehlerfrei per sql insert reinstellen.

    jetzt möchte ich in der selben Konstellation ein update laufen lassen. Muß ja später immer wieder passieren.
    Code:
    Ergebnis der Anweisung enthält mehr als eine Zeile.              
    update        adr04xx t1 set t1.a4mail =  (select E_MAI00001 from
            email3 t2 where t1.a4kto = t2.KD_NR00001)                
                   where t1.a4edua = 'XX'                            
                   and   a4fa     = 1                                
                   and   a4sts    = 0                                
                   and   a4abkz   = 0
    Wie schon gesagt, in der E-Mail ist nur Kunden-Nr und E-Mail Adresse.
    In der anderen Datei ist die Kunden-Nummer mit dem Schlüssel XX eindeutig.
    Ich habe die Daten mal in Excel übernommen und sehe dort auch keine doppeleten Werte.

    Die Fehlerbeschreibung hilft mir nicht weiter.
    Code:
    Nachrichten-ID . . . . :   SQL0811       Bewertung  . . . . . . :   30         
    Nachrichtenart . . . . :   Diagnose                                            
                                                                                   
    Nachricht . . . :   Ergebnis der Anweisung enthält mehr als eine Zeile.        
    Ursache  . . . . :  Die Ergebnistabelle einer Anweisung SELECT INTO, einer     
      Unterabfrage oder einer Unterauswahl einer Anweisung SET enthält mehr als    
      eine Zeile. Es handelt sich um Fehlerart 2. Bei Fehlerart 1 wurde von einer  
      Anweisung SELECT INTO versucht, mehr als eine Zeile zurückzugeben. Bei       
      Fehlerart 2 wurde durch eine Unterauswahl eines Basisprädikats mehr als eine 
      Zeile erstellt. Es ist nur eine Zeile zulässig.
    Für Hinweise dankbar.

    GG

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Bei einem Update über meherere Tabellen muss sicher gestellt werden, dass es für jede Zeile die geändert werden soll genau eine Zeile in der zweiten Tabelle bzw. in dem SELECT-Statement vorhanden ist.

    Die korrekte Syntax für den Update über meherere Tabellen sieht wie folgt aus:
    Code:
    update MyTable2 A                                                
           set (A.Feld1, A.Feld2) = (select Distinct B.Feld1, B.Feld2         
                                       from Mytable1 B               
                                       where     A.Key1 = B.Key1     
                                             and A.Key2 = B.Key2)    
           where exists (select C.Key1, C.Key2                       
                           from MyTable1 C                           
                           where     A.Key1 = C.Key1                 
                                 and A.Key2 = C.Key2)
    Birgitta
    Birgitta Hauser

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

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... der distinct heilt da nix (beides knallt, wenn das nicht eindeutig ist. Eigentlich müsste fetch first row only gehen (habe ich aber nicht ausprobiert, bei mir gibt es immer primary keys und stimmende key Beziehungen).
    Ansonste macht man erst den update mit where exists, dann den insert mit where not exists (damit man nix unnötig doppelt macht).

    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/

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    mit

    select E_MAI00001, count(*) from
    email3 group by E_MAI00001
    having count(*) > 1

    findest du die doppelten

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

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Danke das wars,
    ich hatte in der email3 -Datei (keylose-Datei) wohl aus versehen den Import wohl 2 mal gemacht.
    Es ist schon blöd wenn man alleine arbeitet, und man mit keinem diskutieren kann welche Schritte man gemacht hat. In der Regel kommt man beim erzählen schon selber drauf wo der Fehler ist.

    Bei Gelegenheit werde ich mir meine Katze ins Büro holen, die hört zumindestens immer interessiert zu und sagt ab und zu auch miau (Meisten bei der Frage hast Du Hunger)

    GG

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    @Dieter,

    mein Beispiel funktioniert unter der Prämisse, dass komplett doppelte Sätze oder zumindest doppelte Sätze in denen die upzudatenden Felder bei gleichem Schlüssel die gleichen Werte beinhalten vorhanden sein können.

    Sofern doppelte Schlüssel mit unterschiedlichen Werten in den übrigen Spalten vorhanden sind ist eh' Hopfen und Malz (sorry Ronald!) verloren, welcher Wert ist denn nun der richtige und welchen Wert soll er denn übernehmen?

    Ob das Hinzufügen von FETCH FIRST ROW ONLY dann die Ideallösung ist, bei der gnadenlos der erste Satz mit den Schlüssel-Werten genommen wird, wage ich denn doch zu bezweifeln.
    Insbesondere da der "erste" Satz abhängig von dem Zugriffsweg, den sich der Optimizer ausgesucht hat, bestimmt ist.

    Birgitta
    Birgitta Hauser

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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... die Katze hätte hier wohl geholfen, jedenfalls ist klar, was sie auf die Frage: "Wie findest Du diese Lösung?" gesagt hätte: "Mau!".

    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/

Similar Threads

  1. SQL V5R4 Insert into
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 10-10-14, 08:13
  2. SQL per Navigator V5R4
    By KingofKning in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 03-10-14, 11:37
  3. SQL V5R4 DEC -> HEX
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 19-08-14, 13:29
  4. Datum die xte + 1 SQL V5R4
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 25-07-14, 15:45
  5. V5R4
    By dino in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 18-12-13, 13:59

Berechtigungen

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