我有以下sql查询:
SELECT (SELECT ...) AS X, (SELECT ...) AS Y from my_table
'X'很难计算,并且它被用作计算Y的输入。但是,如果我尝试在查询中引用X来计算Y甚至在主查询中,我会得到以下错误消息:< / p>
Error: column "X" does not exist
一旦计算出来,有没有办法引用X?我真的不想计算两次,因为这看起来非常低效。
答案 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
部分,将其结果存储在临时表中。然后在主查询中使用该临时表。