Maison >base de données >tutoriel mysql >Comment résoudre « ORA-00918 : colonne définie de manière ambiguë » dans les requêtes SELECT * ?

Comment résoudre « ORA-00918 : colonne définie de manière ambiguë » dans les requêtes SELECT * ?

DDD
DDDoriginal
2025-01-13 21:15:47487parcourir

How to Resolve

*Dépannage « ORA-00918 : colonne définie de manière ambiguë » dans SELECT Requêtes**

L'erreur « ORA-00918 : colonne définie de manière ambiguë » survient généralement lors de l'exécution de SELECT * requêtes sur plusieurs tables jointes contenant des colonnes portant des noms identiques. Le moteur de base de données Oracle ne peut pas déterminer quelle colonne vous souhaitez récupérer lorsque plusieurs tables partagent un nom de colonne.

Exemple illustratif et solution

Considérez cette requête 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>

Cette requête génère l'erreur car plusieurs tables ( coaches, people, users) contiennent une colonne nommée "id".

Pour corriger cela, évitez d'utiliser SELECT *. Au lieu de cela, spécifiez explicitement les colonnes dont vous avez besoin :

Méthode 1 : Sélection directe de colonnes

Cette méthode sélectionne directement les colonnes souhaitées par leurs noms complets (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>

Méthode 2 : Utiliser des alias de colonnes

Cette approche attribue des alias uniques aux colonnes avec des noms en double. Cela rend les colonnes sélectionnées sans ambiguïté :

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

En utilisant l'une ou l'autre de ces méthodes, l'ambiguïté est supprimée et la requête s'exécutera avec succès. Préférez toujours la sélection explicite des colonnes à SELECT * dans les requêtes impliquant des jointures pour éviter cette erreur courante et améliorer la lisibilité et la maintenabilité des requêtes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn