这两个查询有什么区别?我一直拒绝加入 ANSI 语法的潮流,因为我无法解开各种语法歧义。
1) 是否返回连接的乘积,然后才过滤掉那些权重 >= 500 的连接记录?并且是 2) 在加入之前过滤掉那些吗?
2 语法错误吗?为什么我可以使用它?
1:
SELECT SOMETHING
FROM FOO
INNER JOIN BAR
ON FOO.NAME = BAR.NAME
WHERE BAR.WEIGHT < 500
2:
SELECT SOMETHING
FROM FOO
INNER JOIN BAR
ON FOO.NAME = BAR.NAME AND BAR.WEIGHT < 500
最佳答案
“是 1) 返回连接的结果,然后才过滤掉那些权重 >= 500 的连接记录吗?2) 在连接之前过滤掉那些记录?”
是的,除了 逻辑上 , 2) 将过滤器应用为 零件的加入,而不是在加入之前。但是,对于内部联接,这种区别不会影响查询的最终结果集。对于外部连接,otoh,这种区别 可以 改变结果。
注意 :在逻辑上使用这个词(说这是查询处理器逻辑执行这些步骤的顺序)很重要,它的意思是字面意思。 实际处理器使用的顺序可能符合也可能不符合这个逻辑描述。只保证查询的结果会出现 好像处理器按此顺序执行了这些步骤......
关于sql - 在 ANSI 语法 SQL 查询中放置条件的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3009185/