Falsche ORA-01427: single-row subquery mehr als eine Zeile
Ich bin immer der Fehler [ORA-01427: single-row subquery mehr als eine Zeile] wenn ich eine Abfrage ausführen. Ich habe eine Abfrage von strukturierten, zum Beispiel so:
SELECT LV.PRICE,
(SELECT C.MODEL_NAME FROM CARS C WHERE C.MODEL_ID = LV.MODEL_ID) as MODEL_NAME
FROM LEDGER_VIEW LV
WHERE LV.PRICE < 500
Es bricht auf der geschachtelte select. Ich weiß, die Logik, die beide in der Ansicht und in dieser Abfrage ist korrekt, und dass es keine chance gibt die geschachtelte select zurückgeben, die mehr als eine Zeile. Die AUTOS Tabelle MODEL_ID ist ein einzigartiges Feld. Wenn ich die Abfrage ausführen, ohne die verschachtelten wählen Sie es nicht wieder dieser Fehler.
Den LEDGER_VIEW ist eine Ansicht gebaut, die auf eine andere Ansicht. Ist es möglich, dass diese gestapelt Ansichten sind buggy in Oracle 10g? Ich weiß nicht, wie sonst zu Debuggen dieses Problems.
Ich bin mir bewusst, ändern könnte ich diese bestimmte Abfrage eine Verknüpfung anstatt einer geschachtelten select -, aber ich würde gerne wissen, warum dies passiert ist, weil ich verschachtelte Abfragen in anderen Orten, wo es nicht so leicht veränderbar.
BEARBEITEN: Hier ist die wirklich seltsame Sache. Die LEDGER_VIEW ist, wie ich schon sagte, erbaut auf der Spitze einer anderen Ansicht. Als test habe ich kopiert die geschachtelte Ansicht SQL direkt in die SQL der SQL LEDGER_VIEW, an die Stelle der Strukturansicht aus, und es kam mit keine Fehler (wie erwartet). Dies scheint mir bestätigen, dass es einige buggy Verhalten entweder mit geschachtelten sichten oder mit der Kombination von geschachtelten sichten + Datenbank-links.
- Wenn Sie sagen, "MODEL_ID ist einzigartig Feld", gibt es einen Primärschlüssel oder einen eindeutigen index, um es zu überprüfen?
- ja, es ist der Primärschlüssel in der Tabelle für AUTOS.
- Könnte das problem sein, in LEDGER_VIEW selbst?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht in der Lage, neu zu erstellen über die Schaffung eines gestapelt anzeigen. (althoug RedFilters wird den Schuldigen finden)
Aber das wirft die Frage auf, warum machst du die Zeile level Abfrage hier? Während die 10g sollten, um Sie zu optimieren das gleiche, ich fand es schon immer leichter, Abfragen zu schreiben, wie unten, sowohl für die Lesbarkeit, Wartbarkeit, und um insbesondere zu vermeiden, die Fehler, die Sie haben (ist es immer, 3 Jahre auf der Straße, gewährleistet durch die Anwendung (sowohl in der db, und die aufrufende app), das Sie nicht haben, eine Bedingung, die die Ursache für diesen Fehler? Eine rouge-Anweisung ruft und Ihre gesamte app stirbt?
Ihre Unterabfrage ist wieder in mehrere Zeilen. Verwenden Sie die folgende Abfrage, um herauszufinden, welche
MODELID
Werte in derCar
Tabelle dupliziert werden:CARS
Tabelle auf der remote-DB, und wenn ja, hat das Duplikate? Nicht, dass es sein sollte Blick auf die remote-eh, natürlich.Schlage ich vor, mit RedFilter Antwort um zu überprüfen, ob es mehrere Autos, die mit einer bestimmten MODEL_ID.
Wenn Sie absolut sicher sind, dass die AUTOS.MODEL_ID einzigartig ist, dann bedeutet es, dass die Fehlermeldung wird erzeugt durch Auswahl von LEDGER_VIEW - so versuchen Sie, die entsprechende Abfrage ohne Unterabfrage auf AUTOS, etwa so:
Wenn Sie immer noch den gleichen Fehler (sollten Sie, wenn AUTOS.MODEL_ID ist einzigartig), müssen Sie die debug-LEDGER_VIEW - ie. überprüfen Sie für die sub-queries Rückkehr mehrere Zeilen in LEDGER_VIEW und die zugrunde liegenden Ansichten basiert.
Erstellen von Ansichten, basierend auf views möglich ist, in den meisten Formen von SQL, aber es ist in der Regel eine schlechte Idee - aus diesem Grund.
Versuchen Sie zwingen Ihre Unterabfrage zurückgeben ein Ergebnis von Anhängen rownum = 1, so:
Wird es wohl funktionieren und wenn es das tut, wissen Sie, dass Ihre Unterabfrage mehrere Zeilen zurückgibt, wird die Beurteilung durch den Fehler-code sollte es sein. Natürlich ist dies keine Lösung, so müssen Sie möglicherweise zu beheben Ihre Daten in der Tabelle für Autos, um tatsächlich das problem zu lösen. Verlassen und rownum = 1 beseitigen die Fehler, wenn model_id ist erneut dupliziert, verhindern, dass Sie bemerken das problem.
rownum = 1
wird es nicht tun, sollten Sierownum < 2
rownum = 1
funktioniert. Es ist nur, wenn Sie versuchen, einen Wert größer als eins, dassrownum = x
funktioniert nicht.