2016-02-26 64 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