这些SQL语句是否相同?

时间:2012-07-11 17:08:30

标签: sql

  

可能重复:
  Explicit vs implicit SQL joins

Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)

Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>

我不确定第二个语句是否可以提供更小的结果集。如果B中有几行与A中的一行匹配,那么我们是否可以使用第二个语句获得所有这些匹配?

2 个答案:

答案 0 :(得分:2)

作为最终结果,是的。 关于执行:查询优化器可能最终为两个查询创建相同的查询执行计划。

如果根据其近似统计数据(例如近似等深度直方图 - 顺便说一下,并非所有时间都是最新的),优化程序将确定第一个连接是比第二个更有选择性,因此,它将首先执行这个。

Stmt1允许您指定联接的顺序,并且考虑到您确切知道表中包含的内容,这可能是更好的解决方案。

答案 1 :(得分:1)

从语义上讲,查询将是相同的。但是,试图依靠计划来证明这一点并不是一个好主意。

还可以放入任意<cond1><cond2>,以便查询在第二种形式中有效,但在第一种形式中不合法。

从这个意义上讲,第二个更为通用,但只要第一个是好的,那么第二个就是等价的。