Saltar al contenido

ORA-00918: columna definida de forma ambigua en SELECCIONAR *

Este grupo de expertos pasados varios días de trabajo y recopilación de de datos, dieron con la solución, esperamos que te sea de utilidad en tu trabajo.

Solución:

La proyección de una consulta solo puede tener una instancia de un nombre determinado. Como muestra su cláusula WHERE, tiene varias tablas con una columna llamada ID. porque estas seleccionando * su proyección tendrá varias columnas llamadas ID. O lo habría sido si no fuera por el compilador que lanzó ORA-00918.

La solución es bastante simple: tendrá que expandir la proyección para seleccionar explícitamente las columnas con nombre. Luego, puede omitir las columnas duplicadas, conservando solo (digamos) COACHES.ID o usar alias de columna: coaches.id as COACHES_ID.

Quizás eso le parezca mucho teclear, pero es la única manera. Si te sirve de consuelo, SELECT * se considera una mala práctica en el código de producción: las columnas con nombres explícitos son mucho más seguras.

Tiene varias columnas con el mismo nombre en su consulta interna, por lo que el error se genera en la consulta externa. Si se deshace de la consulta externa, debería ejecutarse, aunque aún sería 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

Podría ser mucho mejor (tanto para la legibilidad como para el rendimiento) para especificar exactamente qué campos necesita de cada una de las tablas en lugar de seleccionarlos todos de todos modos. Luego, si realmente necesita dos campos con el mismo nombre en diferentes tablas, use alias de columna para diferenciarlos.

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

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 al siempre null columna.

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 el de la columna correspondiente, pero el encabezado de la columna en el resultado está determinado por la primera consulta de los miembros de la unión, por lo que probablemente sea una buena práctica.

Si estás contento con lo expuesto, puedes dejar una noticia acerca de qué le añadirías a esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *