2012-07-11 82 views
0

可能重复:
Explicit vs implicit SQL joins这些SQL语句是否相同?

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

您是否尝试运行它们以查看结果是否相同? – Taryn 2012-07-11 17:09:12

+0

是的,我做了,并与我的例子,它工作。但无论如何,我觉得这很刺激。也许还没有相同的。 – user1000742 2012-07-11 17:13:03

+1

@StefanH谢谢 - 从未实现过接受按钮。 – user1000742 2012-07-11 17:18:39

回答

2

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

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

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

+0

谢谢。我想查询优化器会将第二个变为连接(因为关系代数中没有其他可能性来连接关系) – user1000742 2012-07-11 17:17:55

+0

第二个已经包含三个内部连接。第二个有更大的复杂性。 – Razvan 2012-07-11 17:21:15

+0

要告诉的唯一方法是执行一个SHOW PLAN。根据统计数据,在很多情况下,这两个查询可能会产生相同的计划,因此可能会以相同的方式执行。例如,如果优化器根据索引的选择性和表中的行数决定第二个查询,即首先连接到b优于将b连接到c,则这两个查询将在同样的方式。 – 2012-07-11 17:39:45

1

语义上查询将是相同的。然而,试图依靠计划证明这不是一个好主意。

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

从这个意义上说,第二个是更一般的,但只要第一个是好的,那么第二个就是等价的。