miércoles, 20 de febrero de 2008

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.

2 comentarios:

Anónimo dijo...

Bueno tu ejemplo de subconsulta correlacionada!! thk!

carlino dijo...

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?