UPDATE einer Tabelle von Datensätzen einer anderen

TeddyRuxpin

Neuer Benutzer
Beiträge
3
Hallo,

ich habe ein etwas wirres Oracle SQL-Problem. Die Datenbank ist 11g.

Ich habe eine Tabelle TEMP, da steht eine PersonenID und ein SJ (Sterbejahr) drin,

dann habe ich eine andere Tabelle, nennen wir sie hier mal DATEN, da steht die PersonenID als IDNR drin, sowie eine Spalte SJ, die aber noch leer ist. Diese Tabelle hat bereits andere zur IDNR zugehörige Einträge in weiteren Spalten ,die hier aber unerheblich sind.

Alles in einem DB-Schema.

Nun möchte ich die Spalte SJ in der Tabelle DATEN per UPDATE-Statement befüllen, und zwar mit den Inhalten aus SJ, die in der Tabelle TEMP drin stehen. Es muss natürlich zur PersonenID / IDNR passen. Es sind selbstverständlich mehrere Datensätze die upgedatet werden sollen.

Ich habe nun verschiedene Varianten ausprobiert, aber entweder hat das System nach 24 h immernoch kein ergebnis geliefert, wenn es gearbeitet hat, oder ich hab ne Fehlermeldung bekommen.

Fehlermeldung:
Fehler beim Start in Zeile 6 in Befehl:
update daten d
set SJ = (select distinct t.SJ from temp t, daten d
where t.personen_id = d.idnr)
where d.idnr = (select distinct d.idnr from temp t, daten d
where t.personen_id = d.idnr)
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:
Ich verstehe zwar die Meldung, aber ich habe keinen Plan, wie ich das korrigieren soll.

Ich habe folgendes Statement probiert:
Code:
update daten d
set SJ = (  select distinct t.SJ from temp t, daten d
            where t.personen_id = d.idnr)
where d.idnr = (select distinct d.idnr from temp t, daten d
where t.personen_id = d.idnr);
Kann mir jemand helfen, wie ich o.g. Problem lösen kann? :confused:
Sämtliche Anleitungen im Internet fruchten bei mir nicht, also bitte keine Links....
Danke im Voraus!
 
Werbung:
AW: UPDATE einer Tabelle von Datensätzen einer anderen

Bei der Abfrage:
Code:
update daten d
   set SJ = (select distinct t.SJ from temp t, daten d
              where t.personen_id = d.idnr)
where d.idnr = (select distinct d.idnr from temp t, daten d
                 where t.personen_id = d.idnr)
liefert der SUB-SELECT für "SET SJ = (SELECT ...)" mehr als ein Ergebnis.
Das bedeutet, die Person ist mehrmals gestorben. Welches des Sterbejahre soll nun verwendet werden?
Das kleinste MIN(t.SJ), das größte MAX(t.SJ) oder ein Durchschnitt AVG(t.SJ)?
=> Jedenfalls produziert Dein Abfrage doppelte Daten.

Die WHERE Klausel kannst Du vermutlich weglassen,
da dies bereits durch den SUB-Select geregelt wird.

Lösung 1:
Code:
update daten d
   set SJ = (select t.SJ from temp t
              where t.personen_id = d.idnr)
Lösung 2:
Code:
update daten d
   set SJ = (select MAX(t.SJ) from temp t
              where t.personen_id = d.idnr)

Grüße
Thomas
 
Zurück
Oben