我需要在一个事务中的其他查询中重用大量嵌套SELECT查询的结果。有可能吗?
- 谢谢!
答案 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可以重新知道数组的长度。
另一个解决方案就是
答案 1 :(得分:1)
您可以使用临时表:
SELECT foo,bar INTO TEMP TABLE temp_table
FROM real_table
....
Do some stuff with temp_table
DROP TABLE temp_table;
关闭连接时也会删除临时表。