2015-06-26 100 views
1

我有一個非常SIMPL的Postgres(9.3)查詢,看起來像這樣:創建「空」記錄當月的天沒有記錄

SELECT a.date, b.status 
FROM sis.table_a a 
JOIN sis.table_b b ON a.thing_id = b.thing_id 
WHERE EXTRACT(MONTH FROM a.date) = 06 
AND EXTRACT(YEAR FROM a.date) = 2015 

六月份的一些日子就在table_a不存在,因此顯然不加入table_b。爲這些沒有代表的日子創建記錄併爲其「狀態」列指定一個佔位符(例如'EMPTY')的最佳方式是什麼?這甚至有可能使用純SQL?

+0

可能重複(http://stackoverflow.com/questions/5905064/mark-non-連續日期範圍) –

+0

'cd.date'是非法引用。請修復您的示例代碼並提供Postgres版本和您的列'date'的數據類型。另外:'table_b'總是有天嗎? –

+0

固定。 Table_b包含狀態碼,其中一個適用於table_a中的每一天。 – Preston

回答

1

基本上,你需要LEFT JOIN,它看起來像你還需要generate_series()提供全套的天:

SELECT d.date 
    , a.date IS NOT NULL AS a_exists 
    , COALESCE(b.status, 'status_missing') AS status 
FROM (
    SELECT date::date 
    FROM generate_series('2015-06-01'::date 
         , '2015-06-30'::date 
         , interval '1 day') date 
    ) d 
LEFT JOIN sis.table_a a USING (date) 
LEFT JOIN sis.table_b b USING (thing_id) 
ORDER BY 1; 

使用sargableWHERE條件。你有什麼不能在date上使用普通索引,並且必須默認爲更昂貴的順序掃描。 (在我的最終查詢中沒有更多的WHERE條件。)

另外:不要使用基本類型名稱(和標準SQL中的保留字)date作爲標識符。

相關(第2章):馬克非連續的日期範圍]的