Subconsultas avanzadas

Este tipo de consultas permiten comprobar si un dato se encuentra relacionado con datos que proceden de una segunda consulta.
Aquí se comentan algunas mejoras a ese tipo de consultas implementadas por Oracle.

  • Subconsultas sobre múltiples valores
Los operaciones de subconsulta permiten comparar un valor con el resultado de una subconsulta. También se pueden comparar varios valores:

SELECT * FROM piezas
WHERE (tipo, modelo) IN (SELECT tipo,modelo FROM EXISTENCIAS);

Lógicamente los valores entre paréntesis deben de coincidir, es decir si entre paréntesis se hace referencia a tres campos, el SELECT interior debe devolver tres campos exactamente del mismo tipo que los del paréntesis.

  • Subconsultas correlacionadas
Las subconsultas correlacionadas hacen un proceso fila a fila, de modo que la subconsulta se ejecuta una vez por cada fila de la consulta principal.
Esto es absolutamente diferente respecto a la ejecución normal de una subconsulta, ya que normalmente la subconsulta se ejecuta primero, y con sus resultados se ejecuta la consulta principal. La sintaxis de este tipo de consultas es:

SELECT listaDeColumnas
FROM tabla alias
WHERE expresion operador (SELECT listaDeExpresiones+
FROM tabla2
WHERE expr1 = alias.expr2)

Ejemplo:
SELECT nombre, salario, cod_departamento
FROM empleados emp
WHERE salario >(SELECT AVG(salario)
FROM empleados
WHERE departamento = emp.departamento)

Este ejemplo muestra los datos de los empleados cuyo sueldo supera la media de su departamento.

  • Consultas EXISTS
Este operador devuelve verdadero si la consulta que le sigue devuelve algún valor. Si no, devuelve falso. Se utiliza sobre todo en consultas correlacionadas. Ejemplo:
SELECT tipo,modelo, precio_venta
FROM piezas p WHERE EXISTS (SELECT tipo,modelo FROM existencias
WHERE tipo=p.tipo AND modelo=p.modelo);

Esta consulta devuelve las piezas que se encuentran en la tabla de existencias (es igual al ejemplo comentado en el apartado subconsultas sobre múltiples valores). La consulta contraria es :

SELECT tipo,modelo, precio_venta
FROM piezas p WHERE NOT EXISTS (SELECT tipo,modelo FROM existencias
WHERE tipo=p.tipo AND modelo=p.modelo);

Normalmente las consultas EXISTS se pueden realizar de alguna otra forma con los operadores ya comentados.

Comentarios

Anónimo ha dicho que…
Bueno tu ejemplo de subconsulta correlacionada!! thk!
carlino ha dicho que…
Hola gente, podran ayudarme con esto por favor:

Necesito crear una 3° tabla, partiendo de algunas columnas desde 2 tablas distintas.

desde la primera debo obtener:
POINT, TAG, TYPE

desde la segunda debo obtener:
POINTNUMBER, POINTNAME

la 3° tabla debe contener los valores que cumplan:

substr(TAG,1,3) = substr(POINTNAME,1,3)

lo estoy haciendo y me trae cualquier numero de rows. En algo no estoy agrupando bien.

Este es el query:

{code}
select
distinct a.point,
a.tag,
b.pointname,
a.type,
b.pointnumber
from desde_collect a, desde_ap b
where substr(a.tag, 1,3) = substr(b.pointname,1,3)
group by a.point, a.tag, b.pointname, a.type, b.pointnumber
order by a.tag, b.pointname;
{code}

me devuelve registros repetidos.
POINT Y TAG SE REPITEN

Podran ayudarme a encontrar el error?

Entradas populares de este blog

What is trigger?

Actualizar las estadísticas

Errores de conexión de Oracle