2017-06-19 56 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)在主查询不能在任何地方,因为

“为”关键字将用于列标题

只作别名

但是这个列值不能被其他地方使用。

如果要在其他位置使用该表达式值,则需要将其作为内部查询编写,然后在外部查询中将其用于多次,如果需要。