Inicio » Oracle » SQL » Nueva sintaxis ISO para SQL

Nueva sintaxis ISO para SQL

INNER JOIN:
Tipo de join común, solo muestra datos que coinciden entre dos tablas:
Sintaxis tradicional:

SELECT d.localizacion_id, departamento_nombre
FROM departamentos d, localizaciones l
WHERE d.localizacion_id = l.localizacion_id;

Sintaxis ISO
Para escribir el mismo query con la sintaxis ISO existen varias formas de escribir esta query:
Natural Join
Si se utilice natural join, se permite que Oracle determine la condición y las columnas que necesita para hacer el join:

SELECT localizacion_id, departamento_nombre
FROM departamentos NATURAL JOIN localizaciones;

Clausula: JOIN … USING 
Si las tablas que vamos a utilizar para hacer el el join tienen columnas con el mismo nombre se puede utilizar esta  clausula utilizando poniendo entre paréntesis la columna común:

SELECT localizacion_id, departamento_nombre
FROM departamento JOIN localizacion
USING (localizacion_id);

 JOIN … ON clause 
Cuando las tablas tienen columnas con nombre diferentes utilizaremos JOIN… ON

SELECT d.loc_id, departamentos_nombre
FROM departamentos d JOIN localizaciones l
ON l.localizacion_id = d.loc_id;

Ejemplo un poco más complejo:

SELECT apellido, nombre, departamento_nombre, ciudad, 
FROM empleados
JOIN departamentos USING (departamento_id)
JOIN ciudades USING (ciudad_id)
WHERE departamento_id = 20;

Cuando se utilizan estas clausulas  JOIN … ON o JOIN … USING es más claro, aunque es opcional utilizar la palabra clave INNER así queda más claro el tipo de join:

SELECT location_id, department_name, city
FROM departments INNER JOIN locations
USING (location_id);

OUTER JOIN

Sintaxis tradicional
Se utilizaba un (+) en el where al lado de la columna de la tabla que se sabe que no va a tener datos

SELECT l.location_id, city, department_id, department_name
FROM locations l, departments d
WHERE l.location_id = d.location_id(+);

Sintaxis ISO
Se utilizan las clausulas LEFT JOIN or RIGHT JOIN

SELECT location_id, city, department_id, department_name
FROM locations LEFT JOIN departments d
USING (location_id);

Esta select es la equivalente a la de arriba. Por otro lado cuando se quería recuperar registros que podían no estar en alguna de las dos tablas se utilizaba un UNIO, ahora se simplifica con FULL OUTER JOIN.

Sintaxis tradicional

SELECT last_name, first_name, department_name
FROM employees e, departments d
WHERE e.manager_id = d.manager_id(+) 
UNION
SELECT last_name, first_name, department_name
FROM employees e, departments d
WHERE e.manager_id(+) = d.manager_id 
ORDER BY department_name, last_name, first_name;

Sintaxis ISO

SELECT last_name, first_name, department_name
FROM employees FULL JOIN departments
USING (manager_id);
ORDER BY 1;

CROSS JOIN

Join cartesiano que prácticamente no se utiliza pero en ocasiones puede ser útil: En este caso las vistas v$instance y v$database  solo contiene un registro con lo cual no se produce un producto cartesiano:

Sintaxis tradicional

SELECT d.name, i.host_name, round(sum(f.bytes)/1048576) megabytes
FROM v$database d, v$instance i, v$datafile f
GROUP BY d.name, i.host_name;

Sintaxis ISO

  SELECT d.name, i.host_name, round(sum(f.bytes)/1048576) megabytes
  FROM v$database d
  CROSS JOIN v$instance i
  CROSS JOIN v$datafile f
  GROUP BY d.name, i.host_name;

2 pensamientos en “Nueva sintaxis ISO para SQL

    • Efectivamente quizás he utilizado mal las definiciones, tradicional en oracle, a lo que yo estaba acostumbrada, lo único que quería era hacerme una chuleta de equivalencias ahora que oracle soporta la sintaxis ISO.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s