*Oracle ORA-00918: あいまいな列定義 – SELECT クエリの問題**
Oracle で複数の結合テーブルに対して SELECT *
クエリを実行すると、恐ろしい ORA-00918 エラー「曖昧な列定義」が発生する可能性があります。これは、クエリに異なるテーブルの同じ名前の列が含まれている場合に発生します。 Oracle は、どの列を取得しようとしているのかを判断できません。
このエラーが頻繁に発生するクエリの例を次に示します。
<code class="language-sql">SELECT * FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25</code>
問題の根源
SELECT *
はすべての列を取得しようとしますが、id
が複数のテーブル (coaches
、people
、users
) に存在するため、Oracle はどの id
列を選択するか不明のままです。
解決策: 正確なカラム仕様
ORA-00918 を修正するには、SELECT *
を避けてください。 代わりに、必要な列を明示的にリストします。 これを実現するには主に 2 つの方法があります:
1.列の直接選択
完全修飾名 (table.column) を使用して各列を指定します。
<code class="language-sql">SELECT coaches.id, people.name, users.username, coaches.team FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25</code>
2.列エイリアスの利用
AS
キーワードを使用して、同じ名前の列に一意の別名を割り当てます。
<code class="language-sql">SELECT coaches.id AS coaches_id, people.name AS person_name, users.username AS user_username, coaches.team AS coaches_team FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25</code>
いずれかの方法を採用すると、Oracle に明確な指示が提供され、ORA-00918 エラーが解決され、クエリが正常に実行されるようになります。 列名例を実際の列名に置き換えてください。
以上がOracle の ORA-00918: SELECT * クエリにおける曖昧な列定義エラーを解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。