Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle JOIN 3表-哪种方式有效?有什么区别吗_Sql_Oracle_Join - Fatal编程技术网

Sql Oracle JOIN 3表-哪种方式有效?有什么区别吗

Sql Oracle JOIN 3表-哪种方式有效?有什么区别吗,sql,oracle,join,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连接on a、 acc=b.acc连接在c.acc=a.acc上 有什么区别吗?我想没有。在性能方面没有区别 对于可维护性,我更喜欢第二种方法。更明确的是,哪些条件用于连接哪些表,更容易看出您是否遗漏了连接条件。如果您的第二个选择是从a上的连接b中读取选择a.acc、b.acc、c.acc。acc=b.acc连接c

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

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

选择a.acc、b.acc、c.acc连接on a、 acc=b.acc连接在c.acc=a.acc上


有什么区别吗?我想没有。

在性能方面没有区别


对于可维护性,我更喜欢第二种方法。更明确的是,哪些条件用于连接哪些表,更容易看出您是否遗漏了连接条件。

如果您的第二个选择是从a上的连接b中读取选择a.acc、b.acc、c.acc。acc=b.acc连接c on c.acc=a.acc;那么就没有区别了。

除了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
我会成为一个有钱人。或者至少有足够的寿司晚餐

当然,大多数时候,很明显,您做了一些错误的事情,因为数据是完全错误的,但偶尔会出现结果非常接近的情况,因此您没有立即发现您做了错误的事情,直到很久以后,您才发现错误并跟踪罪魁祸首查询。如果使用USING子句编写查询,基本上不可能犯这种错误

SELECT <<list of columns>>
  FROM a JOIN a_to_b USING (a_id)
         JOIN b      USING (b_id)

您选择第二种方法有什么原因吗?第二个例子是ANSI-92投诉,而第一个例子是符合ANSI-89的……ANSI-92标准更受欢迎,但不应有性能差异,在执行某种外部联接时,如果使用SQL 99语法,Oracle会选择错误的查询计划,这样的错误数量是合理的。99.9%的情况下,没有什么区别,但在以后的版本中,它偶尔会跳起来咬你,当然不那么频繁。@PaulVargas-我没有费心创建表A和表B,所以我没有使用工具格式化SQL。我只是在这里打出来的。