我可以看到人们以不同的方式加入
从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;
有什么区别吗?我想不是。
答案 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;
,那么没有区别。