PostgreSQL - 使用来自同一查询的先前计算值

时间:2011-02-21 15:24:52

标签: sql postgresql

我有以下sql查询:

SELECT (SELECT ...) AS X, (SELECT ...) AS Y from my_table

'X'很难计算,并且它被用作计算Y的输入。但是,如果我尝试在查询中引用X来计算Y甚至在主查询中,我会得到以下错误消息:< / p>

Error: column "X" does not exist

一旦计算出来,有没有办法引用X?我真的不想计算两次,因为这看起来非常低效。

3 个答案:

答案 0 :(得分:3)

PostgreSQL通常非常聪明,不必两次计算相同的东西。所以像

这样的查询
SELECT (SELECT hard_to_compute FROM whatever) AS X,
       (SELECT hard_to_compute FROM whatever)*2 AS Y 
FROM my_table

应该只需要运行两个子查询一次。但是,如果查询类似于

SELECT (SELECT hard_to_compute FROM whatever) AS X,
       (SELECT hard_to_compute*2 FROM whatever) AS Y 
FROM my_table

然后,优化者可能更难以查看两个查询中的相同内容。

另一种处理方法是创建一个STABLE函数来计算X.只要输入相同,STABLE函数总是在单个语句中返回相同的结果,因此Postgres知道它只需要运行一次。请参阅http://www.postgresql.org/docs/9.0/interactive/xfunc-volatility.html

答案 1 :(得分:2)

子选择可能会为你做,例如:

select *, hard_to_compute * 2 as using_hard_to_compute \
from (select *, (i * i) as hard_to_compute from foo) bar;

 i | hard_to_compute | using_hard_to_compute 
---+-----------------+-----------------------
 1 |               1 |                     2
 2 |               4 |                     8
 3 |               9 |                    18

当然,i * i并不是很难计算。我只是假装这是为了这个例子。

答案 2 :(得分:0)

您最好的选择可能是首先运行查询的(SELECT ...) AS X部分,将其结果存储在临时表中。然后在主查询中使用该临时表。