8

我写了一个这样的 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:列不明确定义”。

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

4

3 回答 3

14

错误消息实际上是(惊喜!)告诉您问题出在哪里。一旦对特定列使用 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);
于 2009-01-26T18:25:08.533 回答
8

我的偏好是从不使用USING;始终使用ON。我喜欢我的 SQL 非常明确,并且我认为USING子句感觉少了一步。

在这种情况下,由于您account_nomc_current_view,中出现错误account_masterml_client_account因此无法解析实际的连接。希望这可以帮助。

于 2009-01-19T10:02:53.163 回答
0

使用更干净(imo),但仍然希望外部引用连接字段,如 org 示例或如下示例:

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。也许解决的最佳方法可能只是允许显式引用 using,两全其美。由于这些情况,似乎有必要。

于 2011-03-14T18:45:46.823 回答