【问题标题】:Oracle JOIN 3 tables - Which way is efficient or is there any difference at allOracle JOIN 3 表 - 哪种方式有效或有任何区别
【发布时间】: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;

有什么不同吗?我想不会。

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    在性能方面没有区别。

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

    【讨论】:

    • 你喜欢第二种方法有什么原因吗?
    • 第二个例子是 ANSI-92 投诉,而第一个例子是 ANSI-89 兼容...更首选 ANSI-92 标准
    • 虽然应该没有性能差异,但在使用 SQL 99 语法时,Oracle 选择了不正确的查询计划(更可能是在执行某种外部加入)。 99.9% 的情况下,没有区别,但它偶尔会跳起来咬你(当然,在以后的版本中不太常见)。
    【解决方案2】:

    除了 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)
    

    【讨论】:

    • @PaulVargas - 我没有费心创建表 AB 所以我没有使用工具来格式化 SQL。我只是在这里输入的。
    【解决方案3】:

    如果您的第二个选择是阅读select a.acc, b.acc, c.acc from a JOIN b on a.acc=b.acc JOIN c on c.acc = a.acc;,那么没有区别。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2022-11-18
      • 2016-01-17
      • 1970-01-01
      • 2013-06-10
      • 2015-03-11
      相关资源
      最近更新 更多