代码之家  ›  专栏  ›  技术社区  ›  Sergey Stadnik

Oracle ANSI联接中混合使用“USING”和“ON”

  •  8
  • Sergey Stadnik  · 技术社区  · 16 年前

    我写了一个Oracle SQL表达式,如下所示:

    SELECT
    ...
    FROM mc_current_view a
    JOIN account_master am USING (account_no)
    JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no)
    JOIN ml_client_account mca USING (account_no)
    

    当我尝试运行它时,Oracle在带有“ON”自连接的行中抛出一个错误:“ORA-25154:USING子句的列部分不能有限定符”。

    如果我省略了“am”限定符,它会说:“ORA-00918:列定义不明确”。

    解决这个问题的最佳方法是什么?

    3 回复  |  直到 14 年前
        1
  •  13
  •   DCookie    16 年前

    错误消息实际上(令人惊讶!)告诉你问题到底是什么。一旦你对特定列使用了USING子句,你就不能在查询的任何其他部分为该列名使用列限定符/表别名。解决这个问题的唯一方法是不要在查询中的任何地方使用USING子句,因为您必须在第二个连接条件上使用限定符:

    SELECT
    ...
    FROM mc_current_view a
    JOIN account_master am ON (a.account_no = am.account_no)
    JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no)
    JOIN ml_client_account mca ON (a.account_no = mca.account_no);
    
        2
  •  8
  •   Nick Pierpoint    16 年前

    我的偏好是永远不要使用 使用 ;始终使用 ON .我喜欢我的SQL非常明确 使用 在我看来,这条规定似乎少了一步。

    在这种情况下,出现错误是因为您有 account_no 在……里面 mc_current_view , account_master ,以及 ml_client_account 因此无法解决实际连接问题。希望这能有所帮助。

        3
  •  0
  •   crokusek    14 年前

    使用起来更干净(imo),但仍然希望像组织示例或这样的示例那样从外部引用连接字段:

    select A.field,
           B.field,
           (select count(C.number)
              from tableC C
             where C.join_id = join_id  -- wrong answer w/o prefix, exception with.
            ) avg_number
      from tableA A
      join tableB B using (join_id);
    

    它给出了错误的答案,因为子查询中的join_id意味着C.join_id(匹配所有记录)而不是A或B。也许最好的解决方法可能只是允许使用显式引用,同时兼顾两者。因为这样的案件,似乎有必要。