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