SQL - JOIN BETWEEN与WHERE BETWEEN的区别

8
几周前,我进行了一个查询(不记得是什么),它涉及到BETWEEN运算符。起初,我在WHERE子句中使用它,但它没有产生正确的结果集(再次说明,我不记得问题是什么)。我思考了一下为什么,最终得出结论,我必须将其移到JOIN子句中。
例如。
"原始"查询:
SELECT --something
FROM table1 a
/*type of*/ JOIN table2 b ON a.field = b.field
WHERE b.field2 BETWEEN a.field2 AND a.field3 /*some other conditions*/

修改后的查询:

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*/
JOIN版本与WHERE版本相比,返回的结果集较小,并且JOIN版本产生了正确的结果集,而WHERE版本没有。我现在询问的原因是因为当时我并没有想太多,但今天我的老板质疑我为什么这样做(针对完全不同的查询),我告诉他我上次的经历,他和我都很好奇两种用法之间的区别。我认为一个产生不同结果的原因是WHERE子句版本只选择了一定范围的数据,而JOIN版本则寻找了一定范围的数据进行连接。这是真的吗?还是我遇到了一个受到其他查询影响的独特经历(该查询比示例复杂得多)。编辑:我不同意可能的重复,因为我的问题具体涉及BETWEEN子句,而不是一般的连接。我以前看过提到的帖子,它没有回答我的问题,这就是为什么我发布这个帖子的原因。

1
如果您认为错误是由语法引起的,请查看两个查询返回的数据,并创建一个简化的子集,以便您可以运行这些虚拟查询。如果两个查询都返回正确的结果,则错误在此语法之外。否则,请发布示例数据,以便我们可以重新创建和诊断。 - Tanner
1
在 OUTER JOIN 中,WHERE 和 ON 是不同的。但是你只有 INNER JOIN。因此,在 ON 和 WHERE 子句下面放置哪些子句并不重要。你的问题必须是由另一个条件引起的。 - Matt
3
@RoyalSwish Buddy,你没有做错任何事情,不需要道歉。where子句和on子句在外连接中是不同的,但在语言上对于内连接有相同的行为,而且你的帖子与那篇帖子是不同的。我只是想说,你的帖子不是“那篇”帖子的重复。 - Tushar
@RoyalSwish 但是,伙计;如果您在原始查询中使用了“外部连接”,并且正如您所说:“该帖子旨在涵盖所有类型的连接,我只是选择了INNER JOIN作为示例,这就是为什么标题只说'join'”那么它肯定很重要。对于外部连接,上述查询可能会带来不同的结果。 - Tushar
1
可能是[INNER JOIN ON vs WHERE clause]的重复问题(https://dev59.com/tXNA5IYBdhLWcg3wUL1Y)。 - Tab Alleman
显示剩余2条评论
1个回答

1

这两个版本没有区别,除非你在其中一个版本中由于缺少括号而具有错误的优先级。


1
只要是内连接而不是外连接! - jarlh
1
@jarlh 是的。上面两个版本都只使用了INNER JOIN。如果它们使用OUTER JOIN,那将完全不同。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接