*SELECT クエリにおける「ORA-00918: 列があいまいに定義されています」のトラブルシューティング**
エラー「ORA-00918: 列があいまいに定義されています」は、同じ名前の列を含む複数の結合テーブルに対して SELECT *
クエリを実行するときによく発生します。 複数のテーブルが列名を共有している場合、Oracle のデータベース エンジンはどの列を取得するかを判断できません。
例と解決策
次の SQL クエリについて考えてみましょう:
<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>
複数のテーブル (coaches
、people
、users
) に「id」という名前の列が含まれているため、このクエリではエラーが発生します。
これを修正するには、SELECT *
の使用を避けてください。代わりに、必要な列を明示的に指定します:
方法 1: 列を直接選択する
このメソッドは、完全修飾名 (table.column) によって目的の列を直接選択します。
<code class="language-sql">SELECT coaches.id, people.name, users.username, coaches.title 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: 列エイリアスの使用
このアプローチでは、重複した名前を持つ列に一意のエイリアスを割り当てます。 これにより、選択された列が明確になります:
<code class="language-sql">SELECT coaches.id AS coach_id, people.name AS person_name, users.username AS user_username, coaches.title AS coach_title 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 *
よりも常に明示的な列選択を優先します。
以上がSELECT * クエリの「ORA-00918: 列があいまいに定義されています」を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。