una que promocionado ora objeto nombre columna column campos ambiguously ambiguos ambiguo ambiguedad ambigua sql oracle ora-00918

sql - que - ora 00918 column ambiguously defined in oracle



ORA-00918: columna ambiguamente definida en SELECCIONAR* (3)

La proyección de una consulta solo puede tener una instancia de un nombre de pila. Como muestra su cláusula WHERE, tiene varias tablas con una columna llamada ID. Como está seleccionando * su proyección tendrá varias columnas llamadas ID. O lo hubiera sido si no fuera por el compilador lanzando ORA-00918.

La solución es bastante simple: deberá expandir la proyección para seleccionar columnas nombradas explícitamente. Luego puede omitir las columnas duplicadas, retener solo (por ejemplo) COACHES.ID o usar alias de columna: coaches.id as COACHES_ID .

Tal vez eso te parezca mucho tipeo, pero es la única forma. Si le resulta cómodo, SELECT * se considera una mala práctica en el código de producción: las columnas explícitamente nombradas son mucho más seguras.

Obteniendo ORA-00918: columna ambiguamente definida: ejecutando este 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

Alguna sugerencia por favor?


También puede ver este error al seleccionar una unión donde las columnas correspondientes pueden ser nulas.

select * from (select D.dept_no, D.nullable_comment from dept D union select R.dept_no, NULL from redundant_dept R )

Esto aparentemente confunde al analizador, una solución es asignar un alias de columna a la columna siempre nula.

select * from (select D.dept_no, D.comment from dept D union select R.dept_no, NULL "nullable_comment" from redundant_dept R )

El alias no tiene que ser el mismo que la columna correspondiente, pero el encabezado de la columna en el resultado está determinado por la primera consulta entre los miembros de la unión, por lo que es una buena práctica.


Tiene varias columnas llamadas lo mismo en su consulta interna, por lo que el error se plantea en la consulta externa. Si se deshace de la consulta externa, debería ejecutarse, aunque seguirá siendo confuso:

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

Sería mucho mejor (tanto para la legibilidad como para el rendimiento) especificar exactamente qué campos necesita de cada una de las tablas en lugar de seleccionarlas de todas formas. Entonces, si realmente necesita dos campos llamados lo mismo de diferentes tablas, use alias de columna para diferenciarlos.