Oracle JOIN 3表 - 哪种方式有效还是有任何区别

时间:2011-02-03 22:05:23

标签: sql oracle join

我可以看到人们以不同的方式加入

  

从a,b,c中选择a.acc,b.acc,c.acc   其中a.acc = b.acc和c.acc = a.acc;

  

选择a.acc,b.acc,c.acc JOIN   a.acc = b.acc加入c.acc = a.acc;

有什么区别吗?我想不是。

3 个答案:

答案 0 :(得分:7)

在表现方面没有区别。

我更喜欢第二种可维护性方法。更明确的是使用哪些条件来连接哪些表,并且更容易看出是否错过了连接条件。

答案 1 :(得分:7)

除了Mark的观点,使用后一种语法有助于确保您不会无意中错过连接条件,SQL 99语法的一个好处是,如果您的列命名约定是该列的名称,那么父表和子表匹配,您可以使用USING子句而不是ON子句,即

SELECT <<list of columns>>
  FROM a JOIN b USING( acc )
         JOIN c USING( acc )

这可以提高代码的可读性,并降低因错误地无意中连接表而引入错误的可能性。如果我偶然写了一些像

那样的镍
SELECT <<list of columns>>
  FROM a,
       a_to_b,
       b
 WHERE a.a_id = a_to_b.a_id
   AND b.b_id = a_to_b.a_id -- a_to_b.**a_id** rather than a_to_b.**b_id**

当我真正意味着

SELECT <<list of columns>>
  FROM a,
       a_to_b,
       b
 WHERE a.a_id = a_to_b.a_id
   AND b.b_id = a_to_b.b_id

我会成为一个有钱人。或者至少有足够的寿司晚餐。

当然,大多数时候,很明显你做错了,因为数据完全搞砸了,但有时会发现结果非常接近,以至于你做错了什么并不是很明显直到很久以后你才发现这个bug并追查罪魁祸首查询。如果用USING子句

编写查询,基本上不可能犯这种错误
SELECT <<list of columns>>
  FROM a JOIN a_to_b USING (a_id)
         JOIN b      USING (b_id)

答案 2 :(得分:3)

如果您的第二个选择是阅读select a.acc, b.acc, c.acc from a JOIN b on a.acc=b.acc JOIN c on c.acc = a.acc;,那么没有区别。