2016-06-29 59 views
1

我需要生成一份由特定用戶在過去幾個月中創建的所有記錄(企業)的報告。我產生了以下查詢,並期望它爲每個月提供一行。但是,這個用戶在這幾個月沒有創建任何記錄(企業),所以我得到一個空的結果[]RIGHT OUTER JOIN返回WHERE的空結果

由於我使用RIGHT OUTER JOIN選擇了generate_series列,但我仍然期待每個月都會收到一行,但它不會發生。

start = 3.months.ago 
stop = Time.now 

new_businesses = Business.select(
    "generate_series, count(id) as new"). 
    joins("RIGHT OUTER JOIN (SELECT 
    generate_series(#{start.month}, #{stop.month})) series 
    ON generate_series = date_part('month', created_at) 
    "). 
    where(created_at: start.beginning_of_month .. stop.end_of_month). 
    where(author_id: creator.id). 
    group("generate_series"). 
    order('generate_series ASC') 

如何更改我的查詢以獲取每個月的行而不是空的結果?我正在使用PosgreSQL。

UPDATE

此代碼:

new_businesses = Business.select(
    "generate_series as month, count(id) as new"). 
    joins("RIGHT OUTER JOIN (SELECT 
    generate_series(#{start.month}, #{stop.month})) series 
    ON (generate_series = date_part('month', created_at) 
     AND author_id = #{creator.id} 
     AND created_at BETWEEN '#{start.beginning_of_month.to_formatted_s(:db)}' AND 
     '#{stop.end_of_month.to_formatted_s(:db)}' 
    ) 
    "). 
    group("generate_series"). 
    order('generate_series ASC') 
+0

您是否嘗試過使用'LEFT OUTER JOIN'或' FULL OUTER JOIN'而不是? – jmelesky

+0

@jmelesky是的,同樣的結果 – leemour

回答

2

你的問題是在where一部分是斷裂的任何外部連接。請看例子:

select * 
from a right outer join b on (a.id = b.id) 

它將返回從b所有行和鏈接的值從a,但:

select * 
from a right outer join b on (a.id = b.id) 
where a.some_field = 1 

意願降低所有行a不存在。

做這樣唱正確的做法是在過濾器放入join查詢部分:

select * 
from a right outer join b on (a.id = b.id and a.some_field = 1) 

或使用子查詢:

select * 
from (select * from a where a.some_field = 1) as a right outer join b on (a.id = b.id)