Bedingtes Update schlägt fehl (Oracle)

SlowMoe

Grünschnabel
Hi,

ich habe eine Tabelle mit den drei Spalten FIRST, SECOND und VALUE.

Nun möchte ich folgendes UPDATE Statement erstellen: Ich möchte zuallen VALUEs bei denen Spalte FIRST einen Wert hat (z.B 'a') den Wert des VALUES addieren, dessen Wert in Spalte FIRST beispielsweise 'b' hat. Ausserdem soll der wert in Spalte SECOND jeweils übereinstimmen. Ich habe folgendes definiert:

SQL:
UPDATE tabelle
SET VALUE = VALUE + (SELECT VALUE FROM table WHERE FIRST='b')
WHERE FIRST='a' AND SECOND IN (SELECT SECOND FROM table WHERE FIRST='b');

Hier kommt aber immer: single-row subquery returns more than one row

was mache ich denn falsch? Ich möchte alle VALUEs die bei 'a' stehen mit den Values addieren die bei b stehen. Ausserdem muss noch der jeweilige Wert in Spalte zwei übereinstimmen.

Bitte helft mir ;)
 
Zuletzt bearbeitet von einem Moderator:
Hallo SlowMoe,

dein Querry
Code:
(SELECT VALUE FROM TABLE WHERE FIRST='b')
, den du zu VALUE hinzu addieren möchtest, liefert mehr als eine Zeile zurück.
Der SQL darf nur einen Wert zurück liefern. In der Where-Bedingung ist der SQL ja auch ok.
 
Hi Bernd,

danke für die Antwort, allerdings bringt mich das nicht weiter. Denn irgendwie muss ich ja die Zellen updaten, auf die diese Bedingung zutrifft. Mittlerweile habe ich folgendes Statement erarbeitet:

SQL:
UPDATE tabelle
SET VALUE = VALUE + 
 (SELECT VALUE FROM tabelle T2
    WHERE T2.FIRST='b' AND  tabelle.SECOND = T2.SECOND)
 WHERE 
FIRST ='a' AND SECOND IN(SELECT SECOND FROM tabelle WHERE FIRST='b');

Problem: ich möchte das Staement automatisch mit Werten füllen (über Java). Beim letzten Subquery stoße ich auf ein Problem. Denn ich vergleiche hier die zweiten Spalten mit einander, wobei das Subquery Informationen über die erste Spalte enthält. Das soll nicht so sein.

Prinzipiell ist es ja ein Update über mehrere Tabellen, denn ich könnte das Subquery auch als View speichern. Kann man das obige Statement nicht vereinfach
 
Zuletzt bearbeitet von einem Moderator:
Hallo SlowMoe,

der Updatebefehl ist ja auch soweit Ok, nur der Querry den du zu Value dazu addieren möchtest, musst du so anpassen, dass das Ergebniss nur eine Zeile hat.
Entweder muss du den SQL noch weiter einschränken oder evtl. gruppieren.

Wenn dir diese Antwort nicht ausreicht, dann brauche ich mehr Infos zu Struktur und Inhalt (Beispiele) der Tabelle, um dir weiter zu helfen.

Alternativ kannst du im Java dir auch vorher den Update-Wert berechnen und dann das Update mit diesem Wert ausführen, so das du keinen Subquerry brauchst.
 
Hallo nochmal,

also das Problem hat sich erledigt. Zunächst hatte ich ja das Phänomen, dass einige Werte beim Update gelöscht wurden. Das hat sich damit erklärt, dass ein VALUE = VALUE + NULL in einer Datenabnk auch wieder zu einem NULL-Wert führt.

Das Problem, nun nur die Werte zu suchen, die tatsächlich einen Partner haben, habe ich letztlich über den join mit einer vorher angelegten VIEW gelöst.

Ich danke Dir, für deine Hilfe Bernd.
 
Zurück