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.
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.
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.
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.
Aquí se comentan algunas mejoras a ese tipo de consultas implementadas por Oracle.
- Subconsultas sobre múltiples 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
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
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
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?