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

4

我需要在同一事务中的其他查询中重复使用大量嵌套SELECT查询的结果。这是否可能?

-- 谢谢!


请说明您所说的“重复使用结果”的含义。 - Christopher
2个回答

3
在存储过程/函数中,您可以这样做:
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 );

使用一个大而慢的查询来收集主键列表,然后对其进行多次查询非常有用,特别是考虑到plpgsql函数可以向客户端返回多个结果集(RETURN SETOF refcursor)。
例如,我使用一个大型搜索查询(gist索引和地理定位)获取50个房地产列表ID;查询包括许多列、连接、排序、哈希,最后使用LIMIT/OFFSET,并且似乎不必通过所有这些列拉动所有列,而是仅使用在搜索中使用的列,然后获取ID列表,应用LIMIT/OFFSET,然后返回并获取所有列。
然后使用此ID列表,我从其他表中获取信息,如联系人、电话号码等。由于一个列表可以有几个电话号码或联系人,因此更容易和更快地使用另一个游标单独返回它们,让应用程序将其组合在一起,而不是使用像array_agg()这样的东西在每个结果行中返回电话号码列表。
好处是你可以选择是否使用预先准备好的语句,或者你也可以使用EXECUTE,这样Postgres就可以重新计划查询,如果你期望数组长度有时非常大,则可以知道。
另一个解决方案是简单地使用临时表(较慢,但您可以分析它,这非常有用),或在您的大查询上创建一个游标,并创建一个返回此游标内容的plpgsql函数,然后您可以多次使用它。

Syntax error at or near "INTEGER" - Gringo Suave

1
你可以使用临时表:
SELECT foo,bar INTO TEMP TABLE temp_table
    FROM real_table
    ....

Do some stuff with temp_table

DROP TABLE temp_table;

当您关闭连接时,临时表也会被删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接