Oracle JOIN 3表 - 哪种方式有效或根本没有任何区别

Van*_*ran 3 sql oracle join

我可以看到人们以不同的方式进行连接

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

在c.acc = a.acc上的a.acc = b.acc JOIN上选择a.acc,b.acc,c.acc JOIN;

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

Mar*_*ers 7

在性能方面没有区别.

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

  • 第二个例子是ANSI-92投诉,而第一个例子符合ANSI-89 ...... ANSI-92标准是更优选的 (7认同)
  • 虽然应该没有性能差异,但是当使用SQL 99语法时,Oracle会选择不正确的查询计划存在合理数量的错误(当您进行某种外部联接时更有可能).99.9%的时间没有区别,但它偶尔会跳起来咬你(当然在以后的版本中不常见). (3认同)

Jus*_*ave 7

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

SELECT <<list of columns>>
  FROM a JOIN b USING( acc )
         JOIN c USING( acc )
Run Code Online (Sandbox Code Playgroud)

这可以提高代码的可读性,并降低因错误地无意中连接表而引入错误的可能性.如果每次我不小心写了类似的东西,我都有镍

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**
Run Code Online (Sandbox Code Playgroud)

当我真正的意思

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
Run Code Online (Sandbox Code Playgroud)

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

当然,大多数情况下,你做错了很明显,因为数据完全是错误的,但偶尔会发生结果非常接近,以至于你做错了并不是很明显,直到很久以后你发现了这个bug并追查了罪魁祸首的查询.如果使用USING子句编写查询,基本上不可能犯这种错误

SELECT <<list of columns>>
  FROM a JOIN a_to_b USING (a_id)
         JOIN b      USING (b_id)
Run Code Online (Sandbox Code Playgroud)