Verständnis der Oracle-aliasing - warum ist nicht ein alias nicht erkannt, die in einer Abfrage, es sei denn, eingewickelt in eine zweite Abfrage?
Ich habe eine Abfrage
SELECT COUNT(*) AS "CNT",
imei
FROM devices
führt nur in Ordnung. Ich möchte zu einer weiteren Einschränkung der Abfrage mit einer WHERE-Anweisung. Die (menschlich) logische nächste Schritt ist, um die Abfrage zu verändern nachfolgend:
SELECT COUNT(*) AS "CNT",
imei
FROM devices
WHERE CNT > 1
Jedoch führt dies zu einer Fehlermeldung ORA-00904: "CNT": Ungültiger Bezeichner. Aus irgendeinem Grund, das einwickeln der Abfrage in einer anderen Abfrage, produziert das gewünschte Ergebnis:
SELECT *
FROM (SELECT COUNT(*) AS "CNT",
imei
FROM devices
GROUP BY imei)
WHERE CNT > 1
Warum Oracle nicht erkennen, die der alias "CNT" in der zweiten Abfrage?
Nebenbei: diese Abfrage (mit Aggregaten) ist besser geschrieben, mit der HAVING-Klausel: "select count(*) cnt, die imei von Endgeräten Gruppe von imei having count(*) > 1"
InformationsquelleAutor simon | 2011-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfache Antwort ist, dass die
AS
- Klausel wird definiert, was die Säule wird aufgerufen, das Ergebnis, die eine andere Tragweite als die Abfrage selbst.In deinem Beispiel mit der
HAVING
Klausel würde am besten funktionieren:InformationsquelleAutor Datajam
Weil die Dokumentation sagt es nicht:
Allerdings, wenn Sie haben eine innere wählen, das ist wie die Erstellung einer inline-Ansicht, wo die Spalte Aliase wirksam werden, so sind Sie in der Lage, Sie in die äußere Ebene.
InformationsquelleAutor Craig
Ich könnte mir vorstellen, da der alias nicht zugeordnet ist, die Ergebnis-Spalte erst nach der WHERE-Klausel verarbeitet wurde und die Daten generiert. Oracle unterscheidet sich von anderen DBMS, in diesem Verhalten?
InformationsquelleAutor Tony Andrews
Zusammen zu fassen, dieses kleine Juwel, erklärt:
10 Einfache Schritte, um ein Vollständiges Verständnis von SQL
Als Folge, alles, was Sie label mit "ALS" wird nur verfügbar sein, wenn die
WHERE
,HAVING
undGROUP BY
wurden bereits durchgeführt.InformationsquelleAutor David Tonhofer