Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL结果来自第二个表的范围_Sql_Nested_Between - Fatal编程技术网

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的问题,但实际上它适用于所有范围。一般来说,范围应指定为下限包含>=,上限排除'