Announcement

Collapse
No announcement yet.

ORA-01427: Unterabfrage fur eine Zeile liefert mehr als eine Zeile ??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ORA-01427: Unterabfrage fur eine Zeile liefert mehr als eine Zeile ??

    Hallo zusammen,

    ich habe leider das Problem, das ich genau an diesem Punkt (siehe Fehlermeldung ) nicht mehr weiter komme.
    Ich habe eine Abfrage erstellt, bei dem ich zwei Tabellen mit ihren Rechnungssummen auf Richtigkeit verglichen habe. Nun wollte ich die Falsch migrierten Werte mit den richtigen updaten.

    Meine Abfrage:

    update Prod.Rechnungen Produktion
    set Produktion.rechnung_summe=nvl((
    select Migration.rechnung_summe
    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.vertrag_nr=1
    and Migration.rechnung_gueltig_ab=Produktion.rechnung_ gueltig_ab
    and Migration.rechnung_historie='Aktuell'
    and Produktion.rechnung_hhistorie='Aktuell'
    and Migration.rechnung_summe!=Produktion.rechnung_summ e),0)

    Und zwarhabe ich folgenden Fall. Ich habe einen Kunden mit der kunde_nr=1 der 2 Verträge hat. Kunde_nr=1 mit Vertrag_nr=1 hat rechnungssumme=12000 und ebenfalls hat der Kunde_nr=1 mit Vertrag_nr=2 die rechnungssumme=8500.

    Es klappt Leider nicht!! Weil ich ständig diese Fehlermeldung erhalte.
    Ich habe auch, wie Ihr das ja auch sieht, die doppelten Werte einzuschränken.

    Aber Leider brachte auch dies kein Erfolg. Könnt ihr mir evtl. sagen wie man das umgehen kann???

    Ich hoffe ich habe dazu alles gesagt.

  • #2
    Hi,
    warum hast du im Fromabschnitt den die FROM "Prod.Rechnungen@Prod Produktion" noch einmal mit drin? Du möchtest doch die zu änderne Tabelle mit der Migration Joinen:

    UPDATE Prod.Rechnungen Produktion
    SET Produktion.rechnung_summe=NVL(( SELECT Migration.rechnung_summe
    FROM Mig.Rechnungen Migration
    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.vertrag_nr = 1
    AND Migration.rechnung_gueltig_ab = Produktion.rechnung_ gueltig_ab
    AND Migration.rechnung_historie = 'Aktuell'
    AND Produktion.rechnung_hhistorie = 'Aktuell'
    AND Migration.rechnung_summe != Produktion.rechnung_summ e
    ),0)

    Comment


    • #3
      Hi uminky,

      ja das stimmt. Aber ich dachte dass muss drin bleiben?
      Wie kann ich dass den anders lösen??

      Sorry aber meine SQL Kenntnisse sind etwas begrenzt.

      Comment


      • #4
        Hallo Uminky,

        ich habe gerade diesen Statement umgeändert und ausgeführt. Das lief schon mal.

        Was mich jetzt richtig stutzig macht ist die, dass ich ca 758 (rows) Werte ändern wollte.
        Der Compiler gibt mir an ca.100.000 rows upgedatet wurden.

        Ich habe auch den Rollback durchgeführt.

        Die Select Abfrage liefert mir 758 zeilen, die geändert werden müssen. Warum hat Oracle mehrere Zeilen versucht upzudaten????
        Zuletzt editiert von z.t.i; 13.11.2009, 12:59.

        Comment


        • #5
          ein "select count(*) from Prod.Rechnungen Produktion" gibt was zurück?

          Comment


          • #6
            HI,

            ja der gibt mir genau diesen Wert zurück den ich gerade aufgeschrieben habe... und zwar ca. diese 100.000 rows.

            Aber wieseo macht er das ???
            Muss ich eine weitere Einschränkung für den Update Statemnt bauen????
            Wenn ja worauf muss ich da achten??

            Comment


            • #7
              Das du nur die 758 Rows ins Update nimmst, die du brauchst. Wie viele sind den in "Mig.Rechnungen" drin mit:
              Migration.rechnung_art = 'Einzug'
              AND Migration.vertrag_nr = 1
              AND Migration.rechnung_historie = 'Aktuell'

              Comment


              • #8
                Hi,
                wenn ich dass alles in der Migration drin habe:

                Migration.rechnung_art = 'Einzug'
                AND Migration.vertrag_nr = 1
                AND Migration.rechnung_historie = 'Aktuell'

                erhalte ich selbstverständlich mehrere Werte, die dann aber auch nicht stimmig sind.

                Ich benötige genau die 758 Rows. Dieser kriege ich aber auch nur raus, wenn ich meine SQL-Statement gegen die beiden Umgebungen Abfrage.

                Anscheinend habe ich mit dem Update gschafft alle rechnungssummen in der Produktion mit einem Wert upzudaten.(Gott sei Dank habe ich es nicht committed )!!

                Ich denke also, dass es eher an dem Update Befehl liegt, weil der ja nur einen Wert (denk ich Mal) zugewiesen bekommt. Wie könnt ich das denn (anders) lösen????

                Wäre für jeden Tipp dankbar.
                Zuletzt editiert von z.t.i; 13.11.2009, 14:01.

                Comment


                • #9
                  Ist es das? Wenn nicht, brauche ich mehr Infos.
                  UPDATE Prod.Rechnungen Produktion
                  SET Produktion.rechnung_summe=( SELECT Migration.rechnung_summe
                  FROM Mig.Rechnungen Migration
                  WHERE Migration.rechnung_art = 'Einzug'
                  AND Migration.vertrag_nr = 1
                  AND Migration.rechnung_historie = 'Aktuell'
                  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 = Produktion.rechnung_hhistorie
                  AND Migration.rechnung_summe != Produktion.rechnung_summ e
                  )
                  WHERE EXISTS ( SELECT Migration.rechnung_summe
                  FROM Mig.Rechnungen Migration
                  WHERE Migration.rechnung_art = 'Einzug'
                  AND Migration.vertrag_nr = 1
                  AND Migration.rechnung_historie = 'Aktuell'
                  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 = Produktion.rechnung_hhistorie
                  AND Migration.rechnung_summe != Produktion.rechnung_summ e
                  AND NOT Migration.rechnung_summe IS NULL
                  )
                  /

                  Comment


                  • #10
                    HI,

                    ich teste es mal. Melde mich dann wenn es soweit ist.
                    Zuletzt editiert von z.t.i; 13.11.2009, 15:08.

                    Comment


                    • #11
                      [P.S. /*AND NOT Migration.rechnung_summe IS NULL*/ es müsste "and Migration.rechnung_summe is not null lauten" ]

                      das ergibt das selbe.
                      Und dein letztes Select ist doch das selbe Was in dem Exists steckt.
                      Wo ist das Problem?

                      Comment


                      • #12
                        hi,

                        YES THAT'S IT. Super DANKE Uminky
                        Es wurden genau 758 Zeilen upgedatet. Aber bei der Kontrolle habe ich die korrigierten Werte bei dem jeweligen Kunden nicht stehen. ?? Muss die DB neugestartet werden umd die Änderungen anzunehmen???

                        P.S. Ich habe aber auch kein Commit gestzt.


                        Gruß
                        Zuletzt editiert von z.t.i; 13.11.2009, 15:29.

                        Comment


                        • #13
                          Originally posted by z.t.i View Post
                          hi,

                          Muss die DB neugestartet werden umd die Änderungen anzunehmen???

                          P.S. Ich habe aber auch kein Commit gestzt.


                          Gruß
                          Ja, Oracle muss nach jedem einzelnen Update neugestartet werden...

                          Nein, war ein Scherz. Wenn du keinen Commit gemacht hast, kann nur die Session, welche die Änderung durchgeführt hat, diese auch sehen, alle anderen Sessions sehen die Updates erst nach dem Commit


                          Gruss

                          Comment


                          • #14
                            Hi,

                            Okay Danke für den Tipp.

                            Comment


                            • #15
                              Ja, Oracle muss nach jedem einzelnen Update neugestartet werden...

                              Na dann werde ich mal alle unsere Datenbanken "Updaten" - schönes Wochenende!

                              Comment

                              Working...
                              X