SQL-连接到vs之间的位置

SQL-连接到vs之间的位置,sql,sql-server,join,where,between,Sql,Sql Server,Join,Where,Between,几周前,我做了一个查询(不记得是为了什么),它涉及到BETWEEN操作符。起初,我在WHERE子句中使用了它,但它没有生成正确的结果集(同样,我不记得问题是什么)。我思考了一下原因,最终得出结论,我必须将其移至JOIN子句 e、 g “原始”查询: 修订查询: SELECT --something FROM table1 a /*type of*/ JOIN table2 b ON a.field = b.field AND b.field2 BE

几周前,我做了一个查询(不记得是为了什么),它涉及到
BETWEEN
操作符。起初,我在
WHERE
子句中使用了它,但它没有生成正确的结果集(同样,我不记得问题是什么)。我思考了一下原因,最终得出结论,我必须将其移至
JOIN
子句

e、 g

“原始”查询:

修订查询:

SELECT --something
FROM table1 a
/*type of*/ JOIN table2 b ON a.field = b.field 
                       AND b.field2 BETWEEN a.field2 AND a.field3
WHERE /*some other conditions*/
WHERE
版本相比,
JOIN
版本返回的结果集更小,
JOIN
版本生成正确的结果集,而
WHERE
版本没有

我现在问这个问题的原因是因为当时我一点也没想过,但今天我的老板问我为什么这么做(为了一个完全不同的问题),我告诉他我上次做的经历,他和我都很好奇这两种用法之间的差异

从我所想的,为什么一个产生了与另一个不同的东西是,
WHERE
子句版本只选择了一个数据范围,而
JOIN
版本寻找一个数据范围来加入。是这样吗?或者我确实遇到了受查询其余部分影响的独特体验(查询比示例复杂得多)

编辑
我不同意可能的重复,因为我的一个特别关注
BETWEEN
子句,而不是一般意义上的连接。我以前读过上面提到的文章,但它没有回答我的问题,因此我发布了这篇文章。

两个版本之间没有区别,除非由于缺少括号,其中一个版本的优先级错误。

@CoderofCode我不同意;查看编辑。显示完整查询。我猜括号有问题。如果您认为错误是由语法引起的,请查看两个查询返回的数据,并创建一个简化的数据子集,以便对其运行这些虚拟查询。如果两个查询都返回正确的结果,则错误不在此语法范围内。否则,请发布示例数据,以便我们可以重新创建和诊断。@user4419802我不能,因为查询只是一次性的,在使用后被丢弃了。就像我说的,我不记得那是为了什么;你这边没有什么问题。不用说对不起
where子句和on子句对于外部连接是不同的,但是对于内部连接在语言上的行为是相同的。
并且您的文章与该文章不同。我只是说你的帖子不是“那”帖子的复制品,只要它是内部连接,而不是外部连接@是的。以上两个版本仅使用内部联接。如果他们有一个外部的,那将是完全不同的。
SELECT --something
FROM table1 a
/*type of*/ JOIN table2 b ON a.field = b.field 
                       AND b.field2 BETWEEN a.field2 AND a.field3
WHERE /*some other conditions*/