Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)
Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>
我不确定第二个语句是否可以提供更小的结果集。如果B中有几行与A中的一行匹配,那么我们是否可以使用第二个语句获得所有这些匹配?
答案 0 :(得分:2)
作为最终结果,是的。 关于执行:查询优化器可能最终为两个查询创建相同的查询执行计划。
如果根据其近似统计数据(例如近似等深度直方图 - 顺便说一下,并非所有时间都是最新的),优化程序将确定第一个连接是比第二个更有选择性,因此,它将首先执行这个。
Stmt1允许您指定联接的顺序,并且考虑到您确切知道表中包含的内容,这可能是更好的解决方案。
答案 1 :(得分:1)
从语义上讲,查询将是相同的。但是,试图依靠计划来证明这一点并不是一个好主意。
还可以放入任意<cond1>
和<cond2>
,以便查询在第二种形式中有效,但在第一种形式中不合法。
从这个意义上讲,第二个更为通用,但只要第一个是好的,那么第二个就是等价的。