Wie kann ich das beheben eines ORA-01427 Fehler (Single-row subquery mehr als eine Zeile)?
Meine Anfrage hält eine Rückkehr ORA-01427-Fehler und ich weiß nicht, wie es zu lösen.
update db1.CENSUS set (notes)
=
(
select notes
from db2.CENSUS cen
where db1.CENSUS.uid = cen.uid
)
where headcount_ind = 'Y' and capture_FY = '2015'
- Das Ergebnis in der Klammer MUSS eine einzelne Zeile zurückgeben. Sie sind mit diesem Fehler, da es wieder mehr als eine Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie immer der Fehler, weil es mehr als eine Zeile in
db2.CENSUS
mindestens Wertuid
. (Es könnte noch mehr sein.) Sie können herausfinden, welche Werteuid
sind, die das Problem verursacht, indem Sie Folgendes tun:In diesem Punkt können Sie eine Anzahl von Sachen tun. Sie können löschen Sie die zusätzlichen Zeilen (vielleicht gibt es nicht viele, und Sie nicht möchten, dass Sie sowieso) und update wie in der ursprünglichen Abfrage, oder Sie können mit aggregation in der Unterabfrage, die Sie verwenden, um zu aktualisieren, z.B.:
Darüber hinaus mit Ihrer Anfrage die Art und Weise es vor, wenn es nicht einen entsprechenden Wert von
notes
imdb2.CENSUS
für einen Wert vondb1.CENSUS.uid
,db1.CENSUS.notes
aufNULL
. Vielleicht ist das das Verhalten, das Sie wollen? Wenn nicht, werden Sie wollen so etwas wie die folgenden:Der Fehler bedeutet, dass die Unterabfrage
ist wieder mehr als eine Zeile mit den Noten, während die UPDATE-Anweisung erwartet einen einzelnen Wert zurückgegeben werden.
Versuchen Sie die folgenden.
Könnte dies auch geben Sie den gleichen Fehler, wenn es doppelte Einträge in
db2.CENSUS
für dieuid
und woheadcount_ind = 'Y' and capture_FY = '2015'
quick-and-dirty ist
Aber, dies wahrscheinlich nicht tut, was Sie wollen. Sie haben mehr als eine note eingegeben, die von einem Mitglied des db1.DW_HRT_PERSONNEL_CENSUS.
Um zu verhindern, dass diese Fehler müssen Sie wissen, die Beziehungen zwischen den Tabellen. Ist das ein ein Mitglied von db1.DW_HRT_PERSONNEL_CENSUS Karten auf einer einzigen note, oder, wahrscheinlicher, ein Mitglied von "db1".DW_HRT_PERSONNEL_CENSUS kann viele Volkszählung Noten? Eine wahrscheinlichere Lösung ist:
END LOOP;
Können Sie auch die Verwendung von analytics-Funktionen in Ihre sub-Abfrage, wie
RANK() OVER (PARTITION BY Volkszählung.uid ORDER BY 1 DESC)
und wählen Sie dann den ersten oder zweiten Rang Rang
Ihre update-Abfrage erwartet, dass die innere Abfrage zu lösen, um einen einzelnen Datensatz, sondern es ist eigentlich ein array. Wenn jedes Ergebnis der inneren Abfrage hat den gleichen Wert, können Sie dies tun:
E. g.