Spalte mehrdeutig definiert, die in der Unterabfrage mit rownums
Ich habe zum ausführen einer SQL aus einigen der Benutzer und zeigen Ihre Ergebnisse. Ein Beispiel in SQL könnte dies sein:
SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id
Dieses SQL funktioniert gut, wie es ist, aber ich muss manuell hinzufügen Paginierung und zeigen Sie das rownum, also die SQL endet wie dieser.
SELECT z.*
FROM(
SELECT y.*, ROWNUM rn
FROM (
SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id
) y
WHERE ROWNUM <= 50) z
WHERE rn > 0
Dies wirft eine Ausnahme: "ORA-00918: Spalte mehrdeutig definiert", weil beide Tabelle1 und Tabelle2 enthält ein Feld mit dem gleichen Namen ("id").
Was könnte der beste Weg, dies zu vermeiden?
Grüße.
- UPDATE
In der end, wir hatten zu gehen für die häßliche Art und Weise und zu analysieren, jede SQL-kommen, bevor diese ausgeführt werden. Im Grunde haben wir beschlossen, Sternchen zu entdecken, was die Felder, die wir brauchten, um hinzuzufügen, und den alias jedes Feld mit einer eindeutigen id. Das führte zu Leistungseinbußen, sondern unsere Kunden verstanden, es war die einzige option, die angesichts der Anforderungen.
Werde ich mark Lex Antwort als die Lösung wir am Ende der Arbeit auf.
- möglich, Duplikat der ORA-00918: Spalte mehrdeutig definiert WÄHLEN Sie *
- Nicht genau, da aber leider die speziellen Anforderungen, die ich gemacht hatte, diese Antworten nicht erwünscht dann zurück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie müssen angeben, aliasses für (mindestens einer) Tabelle1.id und Tabelle2.id. Und eventuell für alle anderen entsprechenden columnnames als gut.
Also statt
SELECT t1.*, t2.* FROM table1 t1, table2
so etwas wie:Ich bin nicht vertraut mit Oracle-syntax, aber ich denke, Sie bekommen die Idee.
War ich auf der Suche nach einer Antwort auf etwas ähnliches. Ich war auf einen alias-sub-Abfrage, die hatte ein paar von NULL-Spalten sind. Ich hatte an alias NULL-Spalten, da hatte ich mehr als eine;
wählen Sie ein.*, t2.Spalte t2.Spalte t2.Spalte
(select t1.Spalte t1.Spalte, NULL, NULL, t1.Spalte von t1
wobei t1='WERT') ein
left outer join t2 on t2.Spalte=t1.Spalte;
Sobald ich alias-die NULL-Spalten in der sub-query funktionierte es gut.
Wenn du könntest, ändern Sie die Abfrage syntaktisch (oder kommen die Anwender, dies zu tun), um die explizite
JOIN
syntax mit derUSING
Klausel, dies würde automatisch beheben des Problems auf der hand:Den
USING
Klausel gilt das gleiche wieON t1.id = t2.id
(oder die impliziteJOIN
Sie haben in der Frage), außer dass nur einid
Spalte bleibt im Ergebnis, wodurch Ihr problem.Würden Sie immer noch auf Probleme stoßen, wenn es mehr Spalten mit identischen Namen, die nicht in der
USING
- Klausel. Aliase wie beschrieben von @Lex sind dann unverzichtbar.Verwenden, ersetzen Sie die null-Werte Funktion, um dieses Problem zu beheben.