2014-10-09 30 views
1

我有一個查詢包含兩個SELECT查詢的聯合。每個SELECT查詢返回info。我有興趣獲得每個SELECT查詢返回的元組數量。如何獲取postgreSQL中UNION查詢的每個SELECT返回的元組數量?

我想要做的事,如:

SELECT table1.info AS info, num_result_tuple() 
FROM table1, table2 
WHERE table1.info < table2.info 
UNION 
SELECT table3.info AS info, num_result_tuple() 
FROM table3, table4 
WHERE table3.info < table4.info 

num_result_tuple()必須代表由每個簡單的查詢中發現的記錄數。

在postgresql中是否有這樣的函數?還是有另一種方法來實現這一目標?

回答

2

您可以使用窗口函數此:

SELECT table1.info AS info, count(*) over() as part_count 
FROM table1, table2 
WHERE table1.info < table2.info 
UNION 
SELECT table3.info AS info, count(*) over() 
FROM table3, table4 
WHERE table3.info < table4.info; 

你可能想UNION ALL而不是UNIONUNION將刪除兩個選定部分之間的重複行。如果你知道你不能有任何重複(或者你想要返回它們),UNION ALL會更快。

如果您需要刪除原始查詢中的重複項,則添加count()會更改結果。試想一下,下面的部分結果:

首先查詢:

 
info | part_count 
-----+----------- 
    a | 1 

第二個查詢:

 
info | part_count 
-----+----------- 
    a | 2 
    b | 2 

該聯盟將返回

 
info | part_count 
-----+----------- 
    a | 1 
    a | 2 
    b | 2 

查詢,而不計數將返回

 
info 
---- 
    a 
    b 
+0

謝謝你的回答。事實上,我不想在答案中出現重複,這就是爲什麼我使用'UNION'。 – 2014-10-09 10:58:53

+0

@FopaLéonConstantin:如果第一個和第二個查詢返回的行數不同,則不會有重複的行('a',1)和第二個查詢中的('a',2),('b',2)將返回'a'兩次。 – 2014-10-09 11:01:37

+0

我做了一些實驗,看起來'UNION ALL'比'UNION'在快速的時間裏給出了正確的答案。謝謝 ! – 2014-10-09 11:08:44

相關問題