【发布时间】:2016-03-18 06:38:53
【问题描述】:
我有一个查询,它根据特定日期不存在的相关表中的行从一个表中进行选择。现在,我在感兴趣的每个日期都多次调用此查询。但出于性能原因,我希望对数据库进行一次往返。我想将此查询扩展为在一个日期范围内工作,并返回该范围内的所有行,其中每个日期在另一个表中没有相关行(即范围内每个日期的当前查询结果的 UNION)。结果必须在每一行中包含日期本身。我当前的查询是这样的:
SELECT
t1.id,
t1.field1,
t1.field2,
'2016-03-17' AS nightof_date,
1 as marker
FROM
t1
LEFT JOIN t2 ON (
(t2.a_date = '2016-03-17')
AND (t2.t1_id=t1.id)
AND (some conditions...))
WHERE
(t2.id is NULL)
AND (some other conditions...)
GROUP BY
t1.field3;
这是一个单一查询的小提琴: http://sqlfiddle.com/#!9/553d49/6/0
以下是我想要实现的结果,开始日期为 2016 年 3 月 17 日,结束日期为 2016 年 3 月 20 日: http://sqlfiddle.com/#!9/553d49/6/0
(我想我可以以编程方式生成一个像这样的怪物联合查询,但我希望有一些更优雅的东西,我可以只使用开始日期和结束日期)
有没有办法在不使用NUMBERS 或类似技巧的情况下做到这一点(即,我希望不必生成单独的表格)?
【问题讨论】:
-
您的意思是说,现在您的查询只针对单个日期,您需要将其转换为日期范围,对吗?
-
是的——我试图避免必须创建一个表,即属于“类似技巧”类别。但也许这是唯一的方法。
-
在 t1 上没有日期——从技术上讲,第三个表 t3 与 t1 相关,它具有不同的日期范围,通过要求我正在查看的日期包含在 t3 中来限制来自 t1 的数据范围(即它是 where 子句的“其他条件”的一部分)——但我希望这不会真正影响问题,所以为了简单起见,我把它省略了。
-
如果 SO 只是拒绝发布没有示例数据和期望结果的 SQL 相关问题,那就太好了
-
@Strawberry 点。这是一个小提琴:sqlfiddle.com/#!9/553d49/2/0我希望将结果与 2016-03-17、2016-03-18、2016-03-19 一起运行在一个表中(但对于任意开始和结束日期)。