1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Update einer Spalte mit einer Spalte einer anderen Tabelle funktioniert nicht

Dieses Thema im Forum "Oracle" wurde erstellt von Erika76, 19 November 2019.

  1. Erika76

    Erika76 Neuer Benutzer

    Hall0! Ich hätte eine Frage zu einem Update.

    Und zwar habe ich zwei Tabellen.
    BESTAND_A und BESTAND_B
    Ich möchte nun in der Tabelle BESTAND_A die beiden Spalten MINDESTBESTAND und MAXBESTAND mit den Werten aus der Tabelle BESTAND_B überschreiben. Zum verbinden dient mir die Artikelnummer. (A.ARTIKEL, B.ARTIKEL)

    meine Update dazu sieht so aus:

    update BESTAND_A
    set A.MINBESTAND = (select B.MINBESTAND from BESTAND_B
    join BESTAND_A on B.ARTIKEL = A.ARTIKEL
    );

    Folgender Fehler kommt zurück:

    Fehlerbericht -
    SQL-Fehler: ORA-01427: Unterabfrage für eine Zeile liefert mehr als eine Zeile
    01427. 00000 - "single-row subquery returns more than one row"
    *Cause:
    *Action:

    Führe ich nur ein Select aus, mit dem ich ermitteln möchte, wieviel Zeilen überhaupt geändert werden, läuft das und ergibt 113 Zeilen:

    select count(B.MINBESTAND) from BESTAND_B
    join BESTAND_A on B.ARTIKEL= A.ARTIKEL;

    Ich wäre sehr dankbar, wenn mir jemand helfen könnte!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=# select * from bestand_a;
     artikel | minbestand | maxbestand
    ---------+------------+------------
           1 |            |           
           2 |            |           
           3 |            |           
    (3 rows)
    
    test=*# select * from bestand_b;
     artikel | minbestand | maxbestand
    ---------+------------+------------
           1 |         10 |         20
           2 |         20 |         30
           3 |        200 |        300
    (3 rows)
    test=*# update bestand_a set minbestand = b.minbestand, maxbestand=b.maxbestand from bestand_b b where bestand_a.artikel=b.artikel;
    UPDATE 3
    test=*# select * from bestand_a;
     artikel | minbestand | maxbestand
    ---------+------------+------------
           1 |         10 |         20
           2 |         20 |         30
           3 |        200 |        300
    (3 rows)
    
     
  3. castorp

    castorp Datenbank-Guru

    Oracle erlaubt keinen join (oder FROM) im UPDATE statement (deswegen ist akretschmers Antwort auch wenig hilfreich).

    Für so etwas ist der MERGE Befehl gedacht:
    Code:
    merge into bestand_a a
    using bestand_b b
    on (a.artikel = b.artikel)
    when matched then update
       set minbestand = b.minbestand,
           maxbestand = b.maxbestand;
    
     
    Erika76, Walter und akretschmer gefällt das.
  4. akretschmer

    akretschmer Datenbank-Guru

    oh, dachte das wäre SQL-Standard, ... Danke, @castorp
     
  5. castorp

    castorp Datenbank-Guru

    Nein, im SQL Standard ist weder ein FROM noch ein JOIN im UPDATE Statement zugelassen.
    MERGE hingegen ist Teil des SQL Standards
     
    akretschmer gefällt das.
  6. akretschmer

    akretschmer Datenbank-Guru

    ahhh ... sollte mir mal doch unser 2ndQPostgres 11 installieren, das hat MERGE schon ...
     
  7. Erika76

    Erika76 Neuer Benutzer

    Habt vielen Dank! So geht es! Die 113 Zeilen wurden aktualisiert ….
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden