如何在PostgreSQL中的事务中重用查询结果?

时间:2011-05-05 09:46:20

标签: database postgresql

我需要在一个事务中的其他查询中重用大量嵌套SELECT查询的结果。有可能吗?

- 谢谢!

2 个答案:

答案 0 :(得分:2)

在存储过程/函数中,您可以执行以下操作:

DECLARE mylist INTEGER[]
...
...
mylist := array( SELECT primarykey FROM bigquery );
...
...
SELECT foo FROM bar WHERE id =ANY( mylist );
SELECT x FROM y WHERE id =ANY( mylist );

收集PK列表(使用大慢查询)并对其进行多次查询非常有用,特别是考虑到plpgsql函数可以将多个结果集返回给客户端(RETURN SETOF refcursor)。

例如,我使用大搜索查询(主要索引和地理定位)获取50个房地产列表ID;查询包括许多列,连接,排序,散列,最后的LIMIT / OFFSET,并且在所有这些中不拖动所有列似乎要快得多,而只使用搜索中使用的列,然后获取一个id列表,应用LIMIT / OFFSET,然后返回抓取所有列。

然后使用这个ID列表,我从其他表中获取信息,例如联系人,电话号码等。由于一个列表可以有多个电话号码或联系人,使用另一个游标单独返回它们会更容易,更快,让应用程序将它重新组合在一起,而不是使用像array_agg()这样的东西来返回每个结果行中的phone#列表。

如果您使用预先准备好的语句,或者您也可以使用EXECUTE,那么您可以选择使用EXGUTE,因此如果您希望数组的长度有时非常大,那么postgres可以重新知道数组的长度。

另一个解决方案就是

  • 使用临时表(较慢,但你可以分析它非常有用)
  • 或在你的大查询上创建一个游标,并创建一个plpgsql函数,返回该游标的内容,然后你可以多次使用它

答案 1 :(得分:1)

您可以使用临时表:

SELECT foo,bar INTO TEMP TABLE temp_table
    FROM real_table
    ....

Do some stuff with temp_table

DROP TABLE temp_table;

关闭连接时也会删除临时表。