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」自己結合の行にエラーをスローします。

「am」修飾子を省略すると、「ORA-00918: 列があいまいに定義されています」と表示されます。

これを解決する最善の方法は何ですか?

4

3 に答える 3

14

エラー メッセージは、実際には (驚きです!) 問題が何であるかを正確に示しています。特定の列に USING 句を使用すると、クエリの他の部分でその列名に列修飾子/テーブル エイリアスを使用できなくなります。これを解決する唯一の方法は、クエリのどこにも USING 句を使用しないことです。これは、2 番目の結合条件に修飾子が必要なためです。

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_noため、mc_current_view実際の結合を解決できません。お役に立てれば。account_masterml_client_account

于 2009-01-19T10:02:53.163 に答える
0

The using is cleaner (imo) but it is still desirable to externally refererence the join fields as in the org example or an example like this:

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);

It gives the wrong answer because the join_id within the subquery implies C.join_id (matching all records) rather than A or B. Perhaps the best way to resolve might be just to allow explicit references with using, having the best of both worlds. Seems like there is a need because of cases like these.

于 2011-03-14T18:45:46.823 に答える