4 Stimmen

Wie kann man dynamische Spalten in einer Oracle SQL-Anweisung wiederverwenden?

Ich versuche, einige Spalten wiederzuverwenden, die ich dynamisch in Oracle SQL berechne, etwa so

SELECT
    A*2 AS P,
    P+5 AS Q
FROM tablename

Die Spalte "Tabellenname" hat eine Spalte mit dem Namen "A", aber keine anderen Spalten. Dies gibt mir eine

ORA-00904: "P": invalid identifier

Ich weiß, wie man dieses Problem umgehen kann, indem man eine Unterabfrage wie

SELECT P, P+5 AS Q
FROM ( SELECT A*2 AS P FROM tablename )

aber ich denke, das ist ziemlich hässlich. Außerdem möchte ich die Abfrage etwas komplexer gestalten, z. B. auch "Q" wiederverwenden, und ich möchte nicht noch eine weitere Unterabfrage erstellen.

Aktualisierung: Der Grund, warum ich die Berechnung von "P" speichern möchte, ist, dass ich sie komplexer gestalten und "P" mehrfach verwenden möchte. Ich möchte also nicht explizit sagen "A*2+5 AS Q", denn das würde schnell zu umständlich werden, wenn "P" komplexer wird.

Es muss doch eine gute Möglichkeit geben, dies zu tun, haben Sie eine Idee?

Update: Ich sollte anmerken, dass ich kein DB-Admin bin :(.


Update: Ein Beispiel aus der Praxis, mit einer konkreteren Abfrage. Was ich gerne tun würde, ist:

SELECT 
    SL/SQRT(AB) AS ALPHA,
    5*LOG(10,ALPHA) AS B,
    2.5*LOG(10,1-EXP(-5/ALPHA)*(5/ALPHA+1)) AS D
    BS -2.74 + B + D AS BSA
FROM tablename

Ich habe es vorerst ausgeschrieben, was funktioniert, aber hässlich ist:

SELECT
    SL/SQRT(AB) AS ALPHA,
    5*LOG(10,SL/SQRT(AB)) AS B,
    2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*(5/(SL/SQRT(AB))+1)) AS D
    BS -2.74 + 5*LOG(10,SL/SQRT(AB)) + 2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*((5/(SL/SQRT(AB)))+1)) AS BSA
FROM tablename

Ich könnte all dies tun, nachdem ich die Daten erhalten habe, aber ich dachte, mal sehen, wie viel ich die Datenbank machen lassen kann. Außerdem möchte ich auch nach "BSA" auswählen (was ich jetzt mit dieser Abfrage als Unterabfrage/Mit-Klausel tun kann).


Aktualisieren: OK, ich glaube, ich bin jetzt mit der Lösung von Cade Roux und Dave Costa fertig. Obwohl die Lösung von Pax und Jens Schauder besser aussehen würde, aber ich kann sie nicht verwenden, da ich kein DBA bin. Jetzt weiß ich nicht, wen ich als die beste Antwort markieren soll :).

WITH 
  A1 AS ( 
    SELECT A0.*, 
    SL/SQRT(AB) AS ALPHA
    FROM tablename A0
  ),
  A2 AS (
    SELECT A1.*, 
    5*LOG(10,ALPHA) AS B,
    2.5*LOG(10,1-EXP(-5/ALPHA)*((5/ALPHA)+1)) AS D
    FROM A1
  )
SELECT
  ALPHA, B, D, BS,
  BS -2.74 + B + D AS BSA
FROM A2

Übrigens, falls es jemanden interessiert: SB ist die "Oberflächenhelligkeit" von Galaxien, für die B und D Korrekturterme sind.

0voto

Galal Ouda Punkte 81

Die Wiederverwendung von Aliasen ist in Teradata üblich, kann aber manchmal zu Verwirrung führen, vor allem wenn Sie einen Spaltennamen mit einem Namen aliasieren, der in der Tabelle/Unterabfrage vorhanden ist, und versuchen, ihn wiederzuverwenden, wird die Datenbank die ursprüngliche Spalte verwenden und nicht die, die Sie aliasiert haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X