3

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

6 回答 6

5

1)返回连接的产品,然后过滤掉那些权重> = 500的连接记录吗?2)过滤掉连接之前的那些?”

是的,除了逻辑上2) 将过滤器应用为连接的一部分,而不是在连接之前。但是,对于内部联接,这种区别对查询的最终结果集没有影响。对于外连接,otoh,这种区别可以改变结果。

注意:在逻辑上使用这个词(说这是查询处理器在逻辑上执行这些步骤的顺序)很重要,并且是字面意思。处理器使用的实际顺序可能符合也可能不符合这个逻辑描述。只能保证查询的结果看起来好像处理器按此顺序执行了这些步骤......

于 2010-06-09T19:32:52.263 回答
3

输出是相同的,因为它是一个inner join,并且查询计划应该是相同的。我更喜欢 #1 中的语法,因为它将 join 子句与 filter 子句分开,因此对我来说更具可读性。这使得在阅读大型查询时更容易仔细检查您的ON子句,因为它减少了混合过滤子句时可能出现的噪音。

这样做时outer joins,这不再是一个偏好问题 - 您放置的位置BAR.WEIGHT < 500将对输出产生直接影响。

于 2010-06-09T19:27:45.820 回答
3

不同之处在于当您有 OUTER JOINS 时,您将从查询中获得不同的结果。

有关原因的解释,请参见http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN 。

于 2010-06-09T19:32:20.187 回答
0

2 语法不好?为什么我可以使用它?

在 JOIN 子句或 WHERE 子句中放置谓词在语法上没有任何问题,无论哪种方式都适用于 Oracle。无论如何,甲骨文实际上并不关心:)

从逻辑上讲,我有时会使用 JOIN 和 WHERE 子句来使大型、复杂的查询更加自记录。例如:

SELECT dept.name, SUM(emp.salary)
FROM   dept
JOIN   emp
       ON dept.deptno = emp.deptno
          AND emp.commission IS NULL
WHERE  dept.region = :region
GROUP BY dept.name;

此查询具有三个谓词,其中一个是连接条件。我已将 emp.commission 谓词放在 JOIN 子句中,以向其他开发人员表明这是“不可协商的”——在此查询的上下文中,谓词应该始终存在。dept.region 谓词位于 WHERE 子句中,表明它是用户提供的条件。

这是一种风格选择,没有规则,我不会一直这样做。但是,当查询连接许多表并且有几十个谓词时,它会有所帮助。JOIN 子句允许谓词很好地“分组”,否则我们将对 WHERE 子句进行排序,以便谓词在逻辑上组合在一起。

于 2010-06-10T02:25:23.237 回答
0

WHERE子句的条件适用于最终结果集。

子句上的条件ON仅适用于连接操作。

因此,确定最终结果集和连接操作的条件,然后将它们添加到正确的位置。

INNER JOIN没有区别的情况下,因为每个内部联接操作都负责最终的结果集(对于外部联接操作而言并非如此)。因此,对于outer join案件来说,这是一个严重的问题。

在正确的位置添加条件具有以下附加优势,

  1. 可维护
    • 易于从 更改inner joinouter join。不用担心条件。
    • 轻松从查询中删除连接表。
    • 易于更改应用程序特定条件。即所有场景的加入条件都是相同的。但应用程序特定条件(在 WHERE 条件内)可能因场景而异。
  2. 可读性:更容易识别表之间的关系。
于 2010-06-10T03:13:47.837 回答
0

观察查询,您的陈述 1) 和 2) 肯定是正确的;但是,优化器可能有不同的意见。我建议你应该通过 EXPLAIN PLAN 运行这些查询,看看生成的计划是否真的不同。

不过,我很好奇 - 什么语法歧义引起了您的担忧?我更喜欢 ANSI 语法,因为对我来说它更清楚发生了什么。

分享和享受。

于 2010-06-10T01:56:38.010 回答