2011-05-05 20 views

回答

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,那麼postgres可以重新計算知道數組長度的查詢,如果您希望它有時會非常大。

另一種解決方案是簡單地

  • 使用臨時表(速度較慢,但​​你可以分析它,這是非常有用的)
  • 或創建你的大查詢光標,並創建一個PLPGSQL功能返回此光標的內容,那麼你可以使用它幾次
+0

謝謝你的解釋! – Radagast 2011-05-06 07:06:14

+0

謝謝,希望有幫助;) – peufeu 2011-05-06 07:58:32

1

你可以使用一個臨時表:

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

Do some stuff with temp_table 

DROP TABLE temp_table; 

關閉連接時,臨時表也會丟失。

相關問題