一定有更好的方法来编写这个查询。
我想选择一对日期之间的所有数据。理想情况下,结果集的第一行和最后一行将是 WHERE 子句中指定的行。如果这些行不存在,我希望在请求的范围之前和之后的行。
一个例子:
如果我的数据是:
...
135321, 20090311 10:15:00
135321, 20090311 10:45:00
135321, 20090311 11:00:00
135321, 20090311 11:15:00
135321, 20090311 11:30:00
135321, 20090311 12:30:00
...
查询是:
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 10:30:00'
AND datetime <= '20090311 12:00:00'
我希望返回的数据包括 10:15 和 12:30 的行。不仅仅是那些严格满足 WHERE 子句的。
这是我想到的最好的。
SELECT * FROM (
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime > '20090311 10:30:00'
AND datetime < '20090311 12:00:00'
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime <= '20090311 10:30:00'
ORDER BY datetime desc
LIMIT 1
)
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 12:00:00'
ORDER BY datetime asc
LIMIT 1
)
)
AS A
ORDER BY datetime
(暂时忽略 SELECT * 的使用)
编辑: 我在 param_id、datetime 和 (param_id, datetime) 上有索引
最佳答案
我会这样说:
SELECT
o.*
FROM
data_bahf o
WHERE
o.param_id = 135321
AND o.datetime BETWEEN
ISNULL(
(
SELECT MAX(datetime)
FROM data_bahf i
WHERE i.param_id = 135321 AND i.datetime <= '20090311 10:30:00'
),
'0001-01-01 00:00:00'
)
AND
ISNULL(
(
SELECT MIN(datetime)
FROM data_bahf i
WHERE i.param_id = 135321 AND i.datetime >= '20090311 12:00:00'
),
'9999-12-31 23:59:59'
)
编辑:添加后备。
当没有匹配子查询的行时,会得到一个NULL
值,这个值必须被ISNULL()
或者BETWEEN
捕获> 运算符将失败,主查询将完全不返回任何行。
关于sql - 将查询扩展到 WHERE 子句中指定的范围之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/643885/