2016-02-26 65 views
0

我有兩張桌子,人員和班次,並且對於每個想要 的人都可以獲得一週的所有班次。 問題是,並不是每個日期都有一個轉變。 如果沒有轉變我想獲得一個動態的模板結果的日期在沒有轉變爲速效UNION和BETWEEN日期

SELECT p.id, p.name, s.date_of_shift 
FROM people AS p 
LEFT JOIN LATERAL (
    SELECT sh.id, sh.date_of_shift, sh.person_id 
    FROM shifts as sh 
) AS s ON p.id = s.person_id 
WHERE p.id = 2 AND s.date_of_shift BETWEEN '2016-03-21' AND '2016-03-25' 
UNION ALL 
SELECT null, null, '2016-03-21' 
WHERE NOT EXISTS (
    SELECT 1 
    FROM people AS p 
    LEFT JOIN LATERAL (
     SELECT sh.id, sh.date_of_shift, sh.person_id 
     FROM shifts AS sh 
    ) AS s ON p.id = s.person_id 
    WHERE p.id = 88000 AND s.date_of_shift BETWEEN '2016-03-21' AND '2016-03-25'); 

這是我成功地創建查詢。問題是我總是得到相同的日期。但我希望日期在沒有轉變的範圍內。

回答

1

在這樣的地方,你想要的所有日期的範圍內,即使有可能在特定日期沒有數據的情況下,你應該使用generate_series() functionLEFT JOIN您的數據吧:

SELECT DISTINCT p.id, p.name, date_of_shift 
FROM generate_series('2016-03-21'::date, '2016-03-25', interval '1 day') AS d(date_of_shift) 
LEFT JOIN shifts sh USING (date_of_shift) 
LEFT JOIN (SELECT id, name FROM person WHERE id = 2) p ON p.id = sh.person_id; 

SQLFiddle

+0

嗨帕特里克,謝謝你的回答。不幸的是,這並不能解決問題。我做了一個小提琴,以證明在沒有轉變的日子裏,我沒有得到任何結果。 http://sqlfiddle.com/#!15/c04ae/3/0。 – Elux91

+0

問題肯定是where子句[this](http://sqlfiddle.com/#!15/f2fb7/1)給出了更多我想要的東西。但它沒有指定person_id。所以我需要找到一個解決方案。我已經有了一個想法,但明天我會做。感謝您的幫助。 @Patrick – Elux91

+1

嗨Elux91。將WHERE子句移入子選擇並選擇DISTINCT值。查看更新的答案。首先提供一個SQLFiddle - 或者至少是表格定義,樣本數據和期望的輸出 - 在幾個小時前會給你一個合適的答案{;-) – Patrick