Ir al contenido principal

Cualificando Nombres de Columnas Ambiguos

Columnas con el mismo nombre pueden aparecer en las tablas involucradas en un Join. Los nombres de las columnas DEPARTMENT_ID y MANAGER_ID se encuentran en las tablas EMPLOYEES y DEPARTMENTS. La columna REGION_ID está presente en las tablas REGIONS y COUNTRIES. Listar tales columnas en una consulta será un problema cuando Oracle no pueda resolver su origen. Columnas con nombre único en un Join no causa ambigüedad y Oracle puede fácilmente  resolver su Tabla fuente.
El problema de nombres de columnas ambiguos es resuelto mediante la notación de punto. Una columna puede ser prefijada con el nombre de su tabla a la cual pertenece seguido de un punto. Esto diferencia las columnas de una o de otra tabla. Notación de punto puede ser utilizada en consultas que involucran cualquier número de tablas. Referenciar algunas columnas no implica que todas las columnas deban ser referenciadas
Notación de Punto es mejorada con alias en las tablas. Un Alias de Tabla provee un nombre alternativo, usualmente un nombre corto para una tabla. Una columna puede ser referenciada como TABLE_NAME.COLUMN_NAME o TABLE_ALIAS.COLUM_NAME.

-- EJEMPLO Y NOTAS IMPORTANTES DE COLUMNAS AMBIGUAS
-- EN ESTE EJEMPLO LA TABLA EMPLOYEES Y LA TABLE DEPARTMENT COMPARTEN LOS
-- MISMO NOMBRES DE COLUMNAS: MANAGER_ID Y DEPARMENT_ID
-- REALIZAMOS UN JOIN USING PARA ENCONTRAR EL NOMBRE DEL DEPARTAMENTO
-- AL CUAL PERTENECE CADA EMPLEADO. LE COLOCAMOS UN ALIAS A LA TABLA EMPLOYEES

-- 1. Este ejemplo provoca un error debido a que estamos cualificando la columna
-- deparment_id y la cual es la que esta realizando el JOIN como regla las columnas
-- que participen en el JOIN no deben cualificarse.

-- Incorrecto
SELECT e.employee_id, e.first_name, e.manager_id, e.department_id, d.department_id, d.department_name, d.manager_id
FROM   employees e
       JOIN departments d USING (department_id);

-- Correcto
SELECT e.employee_id, e.first_name, e.manager_id, department_id, d.department_name, d.manager_id
FROM   employees e
       JOIN departments d USING (department_id);


-- 2. En este ejemplo provoca un error debido a que hay una columna ambigua en las dos tablas
--    la cual es MANAGER_ID esta aparece en las dos tablas y no se encuentra participando en la
--    clausula JOIN y oracle no puede definir su origen

-- Incorrecto
SELECT e.employee_id, e.first_name, manager_id, department_id, d.department_name
FROM   employees e
       JOIN departments d USING (department_id);

-- Correcto
SELECT e.employee_id, e.first_name, e.manager_id, department_id, d.department_name
FROM   employees e
       JOIN departments d USING (department_id);
      
-- Como conclusion columnas que comparten el mismo nombre en ambas tablas que participan en un
-- join y que no estan en la clausula JOIN deben ser cualificadas con su nombre de tabla.

-- Columnas que comparten el mismo nombre en ambas tablas que participan en un join y que estan
-- en la clausula join no deben ser cualificadas.

Cualificar las columnas con sus tablas a las cuales pertenece ayuda a mejorar el rendimiento de Oracle ya que Oracle no perderá tiempo resolviendo el origen de cada columna.

Comentarios