*Oracle ORA-00918 : Définition de colonne ambiguë – Un problème de requête SELECT **
L'exécution d'une SELECT *
requête sur plusieurs tables jointes dans Oracle peut conduire à la redoutable erreur ORA-00918 : "définition de colonne ambiguë". Cela se produit lorsque votre requête inclut des colonnes portant des noms identiques provenant de différentes tables. Oracle ne peut pas déterminer quelle colonne vous souhaitez récupérer.
Voici un exemple de requête qui déclenche souvent cette erreur :
<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>
La racine du problème
Le SELECT *
tente de récupérer toutes les colonnes, mais comme id
existe dans plusieurs tables (coaches
, people
, users
), Oracle ne sait pas quelle colonne id
sélectionner.
La solution : spécification précise des colonnes
Pour corriger ORA-00918, évitez SELECT *
. Au lieu de cela, répertoriez explicitement les colonnes dont vous avez besoin. Il existe deux manières principales d'y parvenir :
1. Sélection directe de colonnes
Spécifiez chaque colonne en utilisant son nom complet (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. Utilisation des alias de colonnes
Attribuez des alias uniques aux colonnes portant le même nom à l'aide du mot-clé 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>
En employant l'une ou l'autre méthode, vous fournissez à Oracle des instructions sans ambiguïté, résolvant l'erreur ORA-00918 et garantissant que votre requête s'exécute avec succès. N'oubliez pas de remplacer les exemples de noms de colonnes par vos noms de colonnes réels.
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!