Sql Oracle JOIN 3表-哪种方式有效?有什么区别吗
我可以看到人们以不同的方式进行连接 从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上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中读取选择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。我只是在这里打出来的。