2016-11-07 76 views
1

我需要离开连接两个表有一个WHERE条件:Postgres的左联接与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 
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 

我需要得到所有那些在给定的日期目前记录范围。在上面的例子中,我只需要那些在rid = 2范围内的记录。因此,输出上面的查询需要是:

1  record1  2017-10-01 00:00:00  
3  record3  2017-10-01 00:00:00 
+1

你有什么试过?请发布一些示例代码和输出,并告诉我们什么不适合你。另外,请检查此链接:stackoverflow.com/help/mcve。 – CGritton

+1

你使用postgresql或mysql吗? – chresse

+0

您的输出示例不像问题标题中那样需要外连接。这是一个内部连接。 –

回答

1

左连接两个表WHERE条件

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

所以,把条件为,都应该过滤所有行(rid = 2),但要由record_table条件,左加入行证明是实际参加WHERE条款条件:

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; 

As commented,这是有道理的,包括从结果time_table列,但是这是我的可选ADDIT离子。

您还需要非常清楚的上限和下限。一般惯例是包括,排除时间上限(timestamp)范围。因此我使用上面的>=<

相关:

的表现应该是在所有有正确的索引没有问题。 您需要上的time_table(date)上的record_table上的另一个索引(或PK)。

1
SELECT time_tbl.name,record_tbl.date 
FROM dbo.time_table AS time_tbl 
    INNER JOIN record_table AS record_tbl 
      ON time_tbl.id=record_tbl.id 
WHERE(time_tbl.rid=2)  
+4

这在几乎每个方面都是不正确的。错误的JOIN,不正确的条件,错误的结果列。这可能发生,但最重要的是:没有任何解释。 –

0

我不能完全肯定,如果这是你想要的,但如果你的意思是你想要的日期,其中record_table日期之间date_time_table,那么这将做这项工作:

select 
    rt.id, rt.name, rt.date 
from 
    time_table tt 
    join record_table rt on 
    rt.date between tt.start_date and tt.end_date 
where 
    tt.rid = 2 

这就是说,这将是可怕的低效率的大型数据集。如果您的数据相对较小(每个表中有10万条记录,后置过滤器),那么它可能无关紧要,但如果您需要扩展这一概念,则需要了解更多关于数据的信息 - 例如,做日期,总是到每个月的第一个月?

再次,从您的示例中,我不确定这是否是您的意思,即“获取在给定日期范围内存在的所有记录”。