martes, 5 de mayo de 2015

SubConsultas en SQL Server



Es una SELECT anidada en una instrucción INSERT, DELETE, SELECT o UPDATE.

  • Como una tabla derivada
SELECT E.EMP_NO AS NUMERO
,E.APELLIDO
FROM (SELECT EMP_NO, APELLIDO FROM EMP) AS E



  • Como una expresión
SELECT EMP_NO AS [NUMERO]
,APELLIDO
,SALARIO
,(SELECT AVG(SALARIO) FROM EMP)
AS DIFERENCIA
FROM EMP
WHERE OFICIO = 'EMPLEADO'



  • Para correlacionar datos
- Expresión dinámica que cambia en cada fila de una consulta externa
- Es una combinación entre la subconsulta y la fila de la consulta externa.
- Dividen consultas complejas con dos o más consultas simples relacionadas

SELECT APELLIDO, OFICIO,DEPT_NO
FROM EMP AS E
WHERE 20 <
(SELECT DEPT_NO FROM DEPT AS D
WHERE E.DEPT_NO = D.DEPT_NO
AND D.DNOMBRE = 'VENTAS')



Simulacion de una clausula JOIN

Vamos a mostrar los oficios que están en más de un departamento.

SELECT DISTINCT E1.OFICIO FROM EMP AS E1
WHERE E1.OFICIO IN(SELECT E2.OFICIO FROM EMP AS E2
WHERE E1.DEPT_NO <> E2.DEPT_NO)

Se debe utilizar antes una combinación que una subconsulta, la combinación sería asi, dando los mismos resultados:

SELECT DISTINCT E1.OFICIO FROM EMP AS E1
INNER JOIN EMP AS E2
ON E1.OFICIO = E2.OFICIO
WHERE E1.DEPT_NO <> E2.DEPT_NO

Estos son los dos oficios que están en más de un departamento.



Subconsulta para simular una clausula HAVING

SELECT E1.APELLIDO,E1.OFICIO, E1.SALARIO
FROM EMP AS E1
WHERE E1.SALARIO >
(SELECT AVG(E2.SALARIO) FROM EMP AS E2
WHERE E1.OFICIO = E2.OFICIO)

Esta es la consulta utilizando el HAVING, que es la que deberíamos utilizar antes que una subconsulta de simulación HAVING:

SELECT E1.APELLIDO,E1.OFICIO, E1.SALARIO
FROM EMP AS E1
INNER JOIN EMP AS E2
ON E1.OFICIO = E2.OFICIO
GROUP BY E1.OFICIO, E1.SALARIO,E1.APELLIDO
HAVING E1.SALARIO > AVG (E2.SALARIO)



Espero haber ayudado en algo. Hasta la próxima oportunidad!








No hay comentarios:

Publicar un comentario en la entrada