0

我被迫进入一个非正常化的情况。我有一个报告、驱动程序、警报和警报代码表。都有关系。但是,当使用驱动程序 ID 填充的 driver_id 字段创建报告时,所有后续报告也应与驱动程序相关联(即使不会填充这些报告的 driver_id 列),直到创建其警报其警报代码的报告有一个名称字段等于“内部围栏”。理想情况下,填充每个报告的 driver_id 字段会很好,但这不是我所处的情况。

因此,我尝试构建最有效的查询,但我被困在查询中,该查询在指定日期和给定月份内警报代码具有“内部围栏”字符串的报告之间获取报告。

这是我想出的,但给出了“运算符不存在:布尔 <= 字符变化”错误:

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 子句中使用两个不同的列。有什么解决办法吗?

4

1 回答 1

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)。

于 2013-03-27T16:13:01.747 回答