问题描述
SELECT a.*,b.*
FROM df_1 AS a
LEFT JOIN df_2 AS b
ON a.id = b.id
AND a.datadate between b.sdate and b.edate;
SELECT a.*,b.*
FROM df_1 AS a
LEFT JOIN df_2 AS b
ON a.id = b.id
AND b.sdate <= a.datadate <= b.edate;
后一条语句没有给我想要的输出。 IE。存在 a.datadate 不在 b.sdate 和 e.edate 之间的行。前一条语句确实给了我想要的输出。
从概念上讲,我会认为这两个语句彼此相等。显然,我错了。有什么区别?谢谢。
解决方法
这不是有效的 SQL:
AND b.sdate <= a.datadate <= b.edate
原因是解析为:
AND (b.sdate <= a.datadate) <= b.edate
布尔表达式并不适合 <=
。一些数据库(嗯,MySQL)会隐式地将布尔值转换为数字。然后将这些数字隐式转换回日期。因此,在这些情况下,将与 0
和 1
对应的任何日期值进行比较。
所以,总结一下,这在大多数数据库中都是一个语法错误。并且可能会在支持语法的情况下产生难以理解的结果。
我应该注意到,可能有一些 SQL 系统确实支持这种语法。例如,我认为 SAS proc SQL 可以。