PostgreSQL-使用以前从同一查询计算的值
我有以下sql查询:PostgreSQL-使用以前从同一查询计算的值,sql,postgresql,Sql,Postgresql,我有以下sql查询: SELECT (SELECT ...) AS X, (SELECT ...) AS Y from my_table “X”很难计算,它被用作计算Y的输入。但是,如果我试图在计算Y的查询中,甚至在主查询中引用X,我会收到以下错误消息: Error: column "X" does not exist 一旦计算出X,有没有办法引用它?我真的不想计算两次,因为这似乎效率很低。您最好的选择可能是运行SELECT。。。首先作为查询的X部分,将其结果存储在临时表中。然后在主查询中使
SELECT (SELECT ...) AS X, (SELECT ...) AS Y from my_table
“X”很难计算,它被用作计算Y的输入。但是,如果我试图在计算Y的查询中,甚至在主查询中引用X,我会收到以下错误消息:
Error: column "X" does not exist
一旦计算出X,有没有办法引用它?我真的不想计算两次,因为这似乎效率很低。您最好的选择可能是运行SELECT。。。首先作为查询的X部分,将其结果存储在临时表中。然后在主查询中使用该临时表。子选择可能会为您执行此操作,例如:
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
当然,我不难计算。在这个例子中,我只是假装是这样。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
那么,对于乐观主义者来说,这可能更难看出两个查询中的相同之处
另一种处理方法是创建一个稳定函数来计算X。只要输入相同,稳定函数总是在单个语句中返回相同的结果,因此Postgres知道它只需要运行一次。请参阅。您知道它实际上被“计算”了两次吗?临时表的速度很慢,应该是最后的选择。这很容易转换为使用子选择,避免将所有内容拖放到临时区域。