You are not logged in.

  • Login

1

Thursday, November 12th 2009, 1:24pm

SQL Update mit Subselect funktioniert nicht

Hallo,
wie oben schon angegeben funktioniert mein SQL Update nicht. Ich arbeite mit Oracle 10g. Als Fehlermeldung erhalte ich: "ORA-01427: Unterabfrage fur eine Zeile liefert mehr als eine Zeile"

Hier das Code:

SQL Code

1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE Prod.Rechnungen Produktion
SET Produktion.rechnung_summe=nvl((
SELECT Migration.rechnung_summe #und zwar genau hier
FROM Mig.Rechnungen Migration, Prod.Rechnungen@Prod Produktion
WHERE Migration.rechnung_art='Einzug'
AND Migration.kunde_nr=Produktion.kunde_nr
AND Migration.rechnung_nr=Produktion.rechnung_nr
AND Migration.auftrag_nr=Produktion.auftrag_nr
AND Migration.objekt_nr=Produktion.objekt_nr
AND Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab
AND Migration.rechnung_historie='Aktuell'
AND Produktion.rechnung_historie='Aktuell'
AND Migration.rechnung_summe!=Produktion.rechnung_summe),0)


Ich hoffe ihr könnt mir helfen, bei meinem Problem.???

2

Thursday, November 12th 2009, 6:34pm

versuchs mal mit LIMIT 1

SQL Code

1
2
3
UPDATE Prod.Rechnungen Produktion
SET Produktion.rechnung_summe=nvl((
SELECT Migration.rechnung_summe ... LIMIT 1),0)


oder mach es statt mit einem subselect in der Spalte mit einem Subselect neben der Tabelle:

SQL Code

1
2
3
4
5
UPDATE Prod.Rechnungen Produktion, (
	SELECT Migration.rechnung_summe ...
) x 
SET Produktion.rechnung_summe=nvl(rechnung_summe,0)
WHERE Produktion.id = x.id;


Lg

4

Friday, November 13th 2009, 9:40am

Hi d0nut,

danke für deinen Tipp, aber das funktioniert leider nicht. Oracle erwartet an der stelle wo der Klammer ist den SET Befehl. Ungültige SQl-Anweisung wird als Fehlermeldung ausgegeben.

5

Friday, November 13th 2009, 6:49pm

wie du merkst, kenne ich mich mit Oracle leider nicht so aus. Aber ich mag Oracle jetzt schon nicht ;)
MySQL hätte es akzeptiert :-P

6

Friday, November 13th 2009, 11:38pm

Was man üblicherweise in MySQL mit LIMIT macht, macht man in Oracle in der Regel mit einem Cursor, aber das nur am Rande. Der Fehler sagt ja schon eigentlich alles. Du willst in ALLEN Zeilen von Rechnungen den Wert neu berechnen mit den Wert den das Subselect ausgibt. Wenn du dir dein Subselect mal alleine ausführst solltest du feststellen, dass dort mehr als eine Zeile als Ergebnis kommt. Damit Oracle weiß, welchen Wert er in welcher Spalte der anderen Tabelle eintragen soll, musst du einen 1:1 Zeilenzuordnung von Produktion und Migration haben. Du Brauchst also ein im where des Subselects etwas bei dem aus aus Produktion mit Migration verglichen wird, und es nur ein Ergebnis geben kann (üblicherweise werden dort die PKs irgendwie verglichen).

7

Monday, November 16th 2009, 10:26am

Was man üblicherweise in MySQL mit LIMIT macht, macht man in Oracle in der Regel mit einem Cursor, aber das nur am Rande. Der Fehler sagt ja schon eigentlich alles. Du willst in ALLEN Zeilen von Rechnungen den Wert neu berechnen mit den Wert den das Subselect ausgibt. Wenn du dir dein Subselect mal alleine ausführst solltest du feststellen, dass dort mehr als eine Zeile als Ergebnis kommt. Damit Oracle weiß, welchen Wert er in welcher Spalte der anderen Tabelle eintragen soll, musst du einen 1:1 Zeilenzuordnung von Produktion und Migration haben. Du Brauchst also ein im where des Subselects etwas bei dem aus aus Produktion mit Migration verglichen wird, und es nur ein Ergebnis geben kann (üblicherweise werden dort die PKs irgendwie verglichen).


Hi Seba,

danke für den Tipp. Ich habe den Update Statement auch hinbekommen.

Social bookmarks