Postgres Left加入条件

Sye*_*idi 6 mysql sql postgresql date-range left-join

我需要在两个表中加入一个where条件:

time_table
id     rid        start_date                end_date
1       2     2017-07-01 00:00:00     2018-11-01 00:00:00
2       5     2017-01-01 00:00:00     2017-06-01 00:00:00
3       2     2018-07-01 00:00:00     2020-11-01 00:00:00
Run Code Online (Sandbox Code Playgroud) record_table
id      name                 date
1      record1       2017-10-01 00:00:00
2      record2       2017-02-01 00:00:00
3      record3       2017-10-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

我需要获取在给定日期范围内出现的所有记录.在上面的例子中,我需要那些rid = 2仅在范围内的记录.因此,上述查询的输出必须是:

1      record1       2017-10-01 00:00:00    
3      record3       2017-10-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 8

左边连接两个带有where条件的表

这里有一个陷阱等着你.使用a时LEFT [OUTER] JOIN,使用条件进行过滤通常是错误的WHERE,从而使a 的特殊功能无效地无条件地LEFT JOIN包含左表中的所有行.详细说明:

因此,将条件放入WHERE应该过滤所有rows(rid = 2)的子句中,但是将from-join行的record_table条件设置为实际的连接条件:

SELECT t.start_date, t.end_date  -- adding those
     , r.id, r.name, r.date 
FROM   time_table t
LEFT   JOIN record_table r ON r.date >= t.start_date
                          AND r.date <  t.end_date
WHERE  t.rid = 2;
Run Code Online (Sandbox Code Playgroud)

如评论所示,time_table在结果中包含列是有意义的,但这是我的可选添加.

您还需要非常清楚上限和下限.一般约定是在time()范围中包括 lower并排除上限timestamp.因此我使用>=<以上.

有关:

使用正确的索引,性能应该没有问题.你需要一个索引(或PK)time_table(rid),另一个在record_table(date).