2016-12-16 1 views
0

Ich habe 2 Tabellen mit einer Spalte mit dem gleichen Namen. Spalte ist BAN_KEYfunktioniert in einem Fall/(Spalte zweideutig definiert) Fehler in einem anderen

, wenn ich diese Abfrage ausführen

with 
t1 as 
(
    select * 
    from table1 
), 
t2 as 
(
    select * 
    from table2 
) 
t3 as 
(
    select * 
    from t1, t2 
    where t1.c1 = t2.c2 
) 
select * from t3 

ich Fehlerspalte zweideutig definiert, aber wenn ich es auf diese Weise

with 
t1 as 
(
    select * 
    from table1 
), 
t2 as 
(
    select * 
    from table2 
) 
select * 
from t1, t2 
where t1.c1 = t2.c2 

Das Ergebnis wie dieses

BAN_KEY | BAN_KEY_1 | other columns 
some values... 
sieht

Was ist der Grund dafür?

Antwort

4

Zunächst lernen Sie, die richtige JOIN Syntax zu verwenden. Einfache Regel: Nie Kommas in der FROM Klausel verwenden. Immer Verwendung richtig, explizit JOIN s.

Das hat nichts mit Ihrer Frage zu tun. Die Antwort ist viel einfacher. Bei einem CTE (oder einer Tabelle) muss Oracle dem Ergebnis Spaltennamen zuweisen können, damit sie später darauf zugreifen können. Es akzeptiert die Spaltennamen, die Sie bereitstellen, vorausgesetzt, dass Ihre Absicht richtig ist. Doppelte Spaltennamen sind nicht zulässig, da die Referenz nicht eindeutig ist. daher der Fehler.

Warum passiert das nicht für eine Ergebnismenge? Oracle erfordert nicht, dass die Spalten im Ergebnissatz einer Abfrage eindeutig sind. Der Einfachheit halber wird jedoch zwischen Spalten mit demselben Namen unterschieden.

+2

Ich würde Gordons aufschlussreiche Antwort (die ich upvoted) hinzufügen, dass der logische Grund, warum ein CTE doppelte Spaltennamen nicht haben kann, dass, wenn dies zulässig wäre, Oracle keine Möglichkeit hätte, zu wissen, welche Duplikate du verwenden wolltest. Andererseits werden die Spalten einer äußersten Terminalabfrage von nichts referenziert, so dass Duplikate existieren, gibt es einen strittigen Punkt. –

Verwandte Themen