sql - 在 ANSI 语法 SQL 查询中放置条件的位置

标签 sql oracle ansi-sql

这两个查询有什么区别?我一直拒绝加入 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/

相关文章:

sql - 使用具有相同参数的 select 或 update 时受影响的行数不同 - PostgreSQL

mysql - 选择 max(value) 和对应的行,而不使用 rownum 或 limit

MySQL条件过滤json数组中的元素

c# - 从 lambda 表达式生成 sql server 查询的替代方法

sql - 甲骨文 10g : truncate string

oracle - TORA 使用 OUT REF CURSOR 执行包程序

java - 将一组列从一个表复制到另一个表

mysql - 使用 group_concat 加入查询,重复值

sql - 使用oracle中的分析函数查找月份差异

sql-server - 哪种连接语法更好?