使用左连接和generate_series丢失行

时间:2018-01-03 22:04:28

标签: sql postgresql

我不明白为什么我的两个表行为不正确,生成的系列不会在联接表上显示。

TABLE 1: attendance

id | employee_id | flag | entry_date
-------------------------------
1 | 1 | 0 | 2017-11-17
2 | 2 | 0 | 2017-11-17
3 | 3 | 0 | 2017-11-17

这是我的疑问:

SELECT
    attendance.employee_id,
    TO_CHAR(series::date, 'YYYY-MM-DD')
FROM  generate_series('2017-11-16', '2017-11-30', '1 day'::INTERVAL) series
LEFT JOIN (
    SELECT
      employee_id,
      to_char(entry_date, 'YYYY-MM-DD') entry_date
    FROM
        attendance
    WHERE entry_at >= '2017-11-16' AND entry_at <= '2017-11-30'
    GROUP BY to_char(entry_at, 'YYYY-MM-DD'), employee_id
) attendance ON attendance.entry_date = TO_CHAR(series::date, 'YYYY-MM-DD')
ORDER by employee_id

结果是:

employee_id | to_char 
------------------------
1 | 2017-11-17
2 | 2017-11-17
3 | 2017-11-17

我期待2017-11-16显示自我生成的系列在上述日期开始以来会有所不同。

预期结果:

employee_id | to_char 
------------------------
null | 2017-11-16 
null | 2017-11-16
null | 2017-11-16
1 | 2017-11-17
2 | 2017-11-17
3 | 2017-11-17

这是一个要测试的示例SQL小提琴: http://sqlfiddle.com/#!17/d7907/3

更新[2017年1月4日]:看起来我错误地思考,我决定执行相关子查询

我想要做的是根据 generated_series 计算日期数

1 个答案:

答案 0 :(得分:1)

很难理解,你真正需要什么。您所描述的“结果是” - 这些是您的内部查询中的行。如果您使用此内部查询保留join generate_series,则除2017-11-17之外的每个日期将获得1个空行,2017-11-17将为3行。我查了一下 - 它按预期工作:

 employee_id |  to_char
-------------+------------
           1 | 2017-11-17
           2 | 2017-11-17
           3 | 2017-11-17
             | 2017-11-20
             | 2017-11-21
             | 2017-11-22
             | 2017-11-23
             | 2017-11-24
             | 2017-11-25
             | 2017-11-26
             | 2017-11-27
             | 2017-11-28
             | 2017-11-29
             | 2017-11-16
             | 2017-11-30
             | 2017-11-18
             | 2017-11-19