SQL结果来自第二个表的范围
我的日期表类似于:SQL结果来自第二个表的范围,sql,nested,between,Sql,Nested,Between,我的日期表类似于: id date ---------------- 1 2012-02-02 2 2013-02-02 3 2014-04-06 start end -------------------------- 2011-01-01 2013-01-01 2014-01-01 2016-01-01 日期范围表类似于: id date ---------------- 1 2012-
id date
----------------
1 2012-02-02
2 2013-02-02
3 2014-04-06
start end
--------------------------
2011-01-01 2013-01-01
2014-01-01 2016-01-01
日期范围表类似于:
id date
----------------
1 2012-02-02
2 2013-02-02
3 2014-04-06
start end
--------------------------
2011-01-01 2013-01-01
2014-01-01 2016-01-01
如果日期不在日期范围表条目之间,如何从日期表中获取结果
预期结果为id->2,日期->2013-02-02
我试过:
SELECT * FROM date
JOIN date_range
ON date.date NOT BETWEEN date_range.start AND date_range.end
显而易见的失败是:
SELECT * FROM date
WHERE date.date NOT BETWEEN (SELECT start, end FROM date_range)
这就行了。您需要一个左外部联接,以便包含日期表中的所有记录
SELECT D.ID
,D.DATE
FROM DATETABLE D
LEFT OUTER JOIN
DATE_RANGE DR
ON D.DATE >= DR.START
AND D.DATE <= DR.END
WHERE DR.START IS NULL
这就行了。您需要一个左外部联接,以便包含日期表中的所有记录
SELECT D.ID
,D.DATE
FROM DATETABLE D
LEFT OUTER JOIN
DATE_RANGE DR
ON D.DATE >= DR.START
AND D.DATE <= DR.END
WHERE DR.START IS NULL
用途不存在
用途不存在
不要在两者之间使用。使用>=START和@Declan\K非常安全为什么不在两者之间使用?我所听到的唯一的问题是关于它是包容的还是排他性的困惑。是吗?我听过很多关于它的争论。我只是想展示一下初始查询有多接近。我很惊讶为什么这么多人建议使用左外连接,而实际上他们不需要第二个表中的列。在这种情况下,“存在”或“不存在”更可编辑,效率更高。如果date_range.start可为空,那么这里还有一个陷阱。在某些情况下,你需要一致性。再一次,我的意图是显示OPDon’t use在这两者之间有多近。使用>=START和@Declan\K非常安全为什么不在两者之间使用?我所听到的唯一的问题是关于它是包容的还是排他性的困惑。是吗?我听过很多关于它的争论。我只是想展示一下初始查询有多接近。我很惊讶为什么这么多人建议使用左外连接,而实际上他们不需要第二个表中的列。在这种情况下,“存在”或“不存在”更可编辑,效率更高。如果date_range.start可为空,那么这里还有一个陷阱。在某些情况下,你需要一致性。同样,我的目的是展示OPA在其他地方的评论中有多接近,你应该避免使用BETWEEN,特别是在处理你没有提到RDBMS的日期时,有些比其他的更“安全”。作者@AaronBertrand提到了一些特定于SQL Server的问题,但实际上它适用于所有范围。一般来说,范围应指定为下限包含>=,上限独占“正如其他地方的评论中所指出的,您应该避免使用BETWEEN,尤其是在处理未提及RDBMS的日期时,有些日期比其他日期“更安全”。作者@AaronBertrand提到了一些特定于SQL Server的问题,但实际上它适用于所有范围。一般来说,范围应指定为下限包含>=,上限排除'