2016-11-07 74 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萬條記錄,後置過濾器),那麼它可能無關緊要,但如果您需要擴展這一概念,則需要了解更多關於數據的信息 - 例如,做日期,總是到每個月的第一個月?

再次,從您的示例中,我不確定這是否是您的意思,即「獲取在給定日期範圍內存在的所有記錄」。