2013-03-27 69 views
0

我被迫進入非規範化的情況。我有一個報告,驅動程序,警報和alert_codes表。所有人都有關係。但是,當使用驅動程序ID填充driver_id字段創建報告時,所有後續報告都應與驅動程序關聯(即使這些報告的driver_id列不會填充),直到創建了報告,其報警代碼有一個名稱字段等於「內部圍欄」。理想情況下,每個報告的driver_id字段都會填充,但這並不是我所處的情況。不過這不是我所處的情況。PostgreSQL - 查詢兩個不同列的值之間的記錄

因此,我嘗試構建最有效的查詢,但是我抓住了抓取報告的部分查詢在指定的日期和警報代碼在給定月份內具有「內部圍欄」字符串的報告之間。

這是我想出了,但給人一種「操作符不存在:布爾< =字符改變」錯誤:

SELECT reports.* FROM reports 
INNER JOIN alerts ON alerts.report_id = reports.id 
INNER JOIN alert_codes ON alert_codes.id = alerts.code 
WHERE (reports.unit_id = 3000 AND extract(MONTH FROM reports.time) = 3 
AND extract(YEAR FROM reports.time) = 2013) 
BETWEEN reports.time = '2013-03-20 15:21:05.379941' 
AND alert_codes.name = 'Inside fence' 
ORDER BY reports.time asc 

個聲音告訴我,我不能同時採用兩種不同的列與即BETWEEN子句。任何解決方案

回答

0

你可以這樣做:

SELECT reports.* FROM reports 
WHERE 
reports.time >= '2013-03-20 15:21:05.379941' 
AND reports.time <= (
    SELECT min(r2.time) from reports r2 
    INNER JOIN alerts ON alerts.report_id = r2.id 
    INNER JOIN alert_codes ON alert_codes.id = alerts.code 
    WHERE r2.time >= '2013-03-20 15:21:05.379941' 
    AND alert_codes.name = 'Inside fence') 

我排除了unit_id = 3000條款。你可以把它放在有意義的地方(在外部WHERE或內部WHERE)。

+0

查詢的問題是,它只能選擇alert_codes.name等於'Inside fence'的位置。我需要選擇從日期'2013-03-20 15:21:05.379941'開始的所有記錄到有警報代碼名稱爲'Inside fence'的記錄。 – JohnMerlino 2013-03-27 16:29:25

+0

我試圖避免任何編程迭代(例如ruby,python)來減少服務器響應時間。 – JohnMerlino 2013-03-27 16:47:29

+0

@JohnMerlino - 我*想*我明白。查看我的更新。 – 2013-03-27 17:18:46

相關問題