【发布时间】:2011-06-21 00:09:30
【问题描述】:
我可以看到人们以不同的方式进行连接
从 a、b、c 中选择 a.acc、b.acc、c.acc 其中 a.acc=b.acc 和 c.acc = a.acc;
和
选择 a.acc、b.acc、c.acc 加入 a.acc=b.acc 加入 c.acc = a.acc;
有什么不同吗?我想不会。
【问题讨论】:
我可以看到人们以不同的方式进行连接
从 a、b、c 中选择 a.acc、b.acc、c.acc 其中 a.acc=b.acc 和 c.acc = a.acc;
和
选择 a.acc、b.acc、c.acc 加入 a.acc=b.acc 加入 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)
【讨论】:
A 和 B 所以我没有使用工具来格式化 SQL。我只是在这里输入的。
如果您的第二个选择是阅读select a.acc, b.acc, c.acc from a JOIN b on a.acc=b.acc JOIN c on c.acc = a.acc;,那么没有区别。
【讨论】: