我嘗試重用一些列我在甲骨文SQL動態計算,像如何在Oracle SQL語句中重用動態列?
SELECT
A*2 AS P,
P+5 AS Q
FROM tablename
其中「表名」有一個名爲「A」柱,但沒有其他colums。這給了我一個
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-管理員:(
更新:A現實世界的例子,有一個更具體的查詢,我想什麼做的是:
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'(我現在可以使用這個查詢作爲子查詢/帶子句)。
更新:好的,我想現在我已經完成了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是校正項。
是的,這是有效的,我在示例中的查詢變得簡單,實際上我多次使用P值來計算其他列,而P則更加複雜。我會更新這個問題。 – BlackShift 2009-04-13 12:42:53
我不完全確定你爲什麼如此關心查詢。他們傾向於寫一次,然後單獨留下,所以它們真的很「醜」(假設真正醜陋的那些被正確記錄:-)。 – paxdiablo 2009-04-13 12:49:40
我曾經認識的DBA需要關注的* only *事情是原始速度,如果不進行反規範化(即,將生成的列引入到DB2),我認爲您不會輕鬆修復它。 – paxdiablo 2009-04-13 12:50:11