ホームページ > データベース > mysql チュートリアル > SELECT * クエリの「ORA-00918: 列があいまいに定義されています」を解決するにはどうすればよいですか?

SELECT * クエリの「ORA-00918: 列があいまいに定義されています」を解決するにはどうすればよいですか?

DDD
リリース: 2025-01-13 21:15:47
オリジナル
477 人が閲覧しました

How to Resolve

*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>
ログイン後にコピー

複数のテーブル (coachespeopleusers) に「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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート