2013-03-27 118 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

相关问题