2013-03-13 91 views
4

我在这个论坛上发现了类似但不是确切的问题 - 请原谅我,如果我没有做足够的搜索。这是我的question..in甲骨文Oracle SELECT - 另一列的别名作为另一个输入的

select (t.value*2) as inst2, (inst2 * 3) as inst3 
from table t; 

思维的背后是,如果f() = t.value*2是一种昂贵的调用,那么我们就需要做出twice..or是有一个替代查询结构我可以使用(我试图在CTAS中实现这一点)

在此先感谢。

+0

我会检查解释计划..这可能只能被优化器调用一次... – Randy 2013-03-13 15:24:29

+0

兰迪 - 解释计划不是非常有用,因为我发现了..这是误导..我试着沿着@bluefeet建议。谢谢你的提醒。 – 2013-03-13 15:37:01

+0

干杯塞巴斯 - 这是有益的和道歉的重复职位。我会看看另一个线程。 – 2013-03-13 15:38:28

回答

1

如果你想在第二个计算中使用别名,那么你将要使用子查询:

select inst2, 
    (inst2 * 3) as inst3 
from 
(
    select t.value*2 as inst2 
    from table t 
) 
+0

感谢回复@bluefeet。我会尝试按照这些方向进行重组。 – 2013-03-13 15:35:01

2

另一种选择:

with cte as (
    select t.value*2 as inst2 
) 
select 
    cte.inst2, 
    (cte.inst2*3) as inst3 
from cte 

这实际上是相同bluefeet的回复,但我会认为使用with -syntax更容易理解。

相关问题