SQL Update mit Subselect funktioniert nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

    1. update Prod.Rechnungen Produktion
    2. set Produktion.rechnung_summe=nvl((
    3. select Migration.rechnung_summe #und zwar genau hier
    4. from Mig.Rechnungen Migration, Prod.Rechnungen@Prod Produktion
    5. where Migration.rechnung_art='Einzug'
    6. and Migration.kunde_nr=Produktion.kunde_nr
    7. and Migration.rechnung_nr=Produktion.rechnung_nr
    8. and Migration.auftrag_nr=Produktion.auftrag_nr
    9. and Migration.objekt_nr=Produktion.objekt_nr
    10. and Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab
    11. and Migration.rechnung_historie='Aktuell'
    12. and Produktion.rechnung_historie='Aktuell'
    13. and Migration.rechnung_summe!=Produktion.rechnung_summe),0)
    Alles anzeigen


    Ich hoffe ihr könnt mir helfen, bei meinem Problem.???
  • versuchs mal mit LIMIT 1

    Quellcode

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


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

    Quellcode

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


    Lg
  • 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).
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • SeBa schrieb:

    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.