Oracle SQLで動的に計算するいくつかの列を再利用しようとしています。
SELECT
A*2 AS P,
P+5 AS Q
FROM tablename
「tablename」には「A」という列がありますが、他の列はありません。これは私に
ORA-00904: "P": invalid identifier
次のようなサブクエリを使用してこれを回避する方法を知っています
SELECT P, P+5 AS Q
FROM ( SELECT A*2 AS P FROM tablename )
しかし、これはちょっと醜いと思います。さらに、'Q' を再利用するなど、クエリをもう少し複雑にしたいのですが、さらに別のサブクエリを作成したくありません。
更新:「P」の計算を保存したい理由は、計算をより複雑にして、「P」を複数回再利用したいからです。したがって、'A*2+5 AS Q' と明示的に言いたくはありません。'P' が複雑になるにつれて、すぐに面倒になってしまうからです。
これを行う良い方法があるに違いありません、何かアイデアはありますか?
更新:私はDB管理者ではないことに注意してください:(。
更新:より具体的なクエリを使用した実際の例。私がやりたいことは次のとおりです。
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
今のところ、私はそれを書きました。これは機能しますが、醜いです:
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
データを受け取った後、これらすべてを行うことができましたが、データベースにどれだけのことができるか見てみましょう。また、「BSA」も選択したいと思います (これは、このクエリをサブクエリ/with-clause として使用できるようになりました)。
更新: わかりました。今のところ、Cade Roux と Dave Costa のソリューションを完成させたと思います。Pax' と Jens Schauder のソリューションの方が良さそうですが、私は DBA ではないので使用できません。今、誰を最良の回答としてマークするかわかりません:)。
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
ところで、誰かが興味を持っている場合に備えて、SB は銀河の「表面の明るさ」であり、B と D は補正項です。