2017-06-19 46 views
0

選擇查詢我有一個返回數據的一些巨大的查詢,某些列將被通過數學方程爲前操縱:數學變量,而在Oracle

select 
    num1, 
    num2, 
    num2 + num1 as num3, 
    num1 * num3 as num4 
from my Tables... 

的問題,當我嘗試重用計算的出現num3在我的計算num4。難道是我不能用這種語法,並且應該以這種方式使用:

select 
    num1, 
    num2, 
    num2 + num1 as num3, 
    num1 * (num2 + num1) as num4 
from my Tables... 

它似乎並不像國際海事組織的好辦法。有沒有其他方法?

+0

是的,你不能這樣做。另外,您可以在其中執行任何其他操作,只會增加代碼行數。 –

+0

您可以使用一個子查詢來定義可以在外部查詢中重用的別名,但會重複添加很多問題;爲什麼不是一個好方法? (通過複雜的計算,它使維護變得更加困難,但這看起來很簡單,因此不是真正的問題。) –

+0

@SudiptaMondal所以唯一的選擇是重做操作? – Hatik

回答

3

你必須要麼重複,你正在做的計算,或者使用其指定的別名列表達式,然後你就可以參考外部查詢的子查詢:

select 
    num1, 
    num2, 
    num3, 
    num1 * num3 as num4 
from (
    select 
     num1, 
     num2, 
     num2 + num1 as num3 
    from my Tables 
) 

你可以除了在order by子句中外,它不會在同一級別的查詢中引用列別名。 From the documentation

c_alias
指定列表達式別名。 Oracle數據庫將在結果集的列標題中使用此別名。 AS關鍵字是可選的。別名在查詢期間有效地重命名選擇列表項。該別名可以在order_by_條款中使用,但不能用於查詢中的其他子句。

最後一句是重要的一點。使用子查詢可以,但是因爲這是不同的級別。

+0

我明白謝謝 – Hatik

1

由於你的計算,如(NUM2 + NUM1爲NUM3)在主查詢不能在任何地方,因爲

「爲」關鍵字將用於列標題

只作別名

但是這個列值不能被其他地方使用。

如果要在其他位置使用該表達式值,則需要將其作爲內部查詢編寫,然後在外部查詢中將其用於多次,如果需要。