Subconsultas – Casos prácticos 3

Subconsultas – Casos prácticos 3

Las subconsultas se explicaron en un post previo (Ver Subconsultas), este post presenta ejercicios algo más complejos, además de realizar el análisis los costos de ejecución usando el Plan de ejecución.

Ejercicios

1. — Listar los empleados y la cantidad de órdenes generadas

Primero la lista de empleados

Select E.EmployeeId, E.LastName, E.FirstName
from Employees As E
go

Contar las órdenes para un empleado (ejemplo 5)

select Count(O.OrderID) from Orders As O where O.EmployeeID = 5
go

Construir la instrucción con subconsulta

Select E.EmployeeId, E.LastName, E.FirstName,
(select Count(O.OrderID) from Orders As O where O.EmployeeID = E.EmployeeId )
As ‘Cantidad de Órdenes’
from Employees As E
go

Si visualizamos el Plan de ejecución estimado, el Costo de Subárbol estimado es  0.0123845

Analizamos el costo para SQL Server usando Joins para la misma instrucción

Select E.EmployeeId, E.LastName, E.FirstName,
Count(O.OrderID) As ‘Cantidad de Órdenes’
from Employees As E
join Orders As O on E.EmployeeId = O.EmployeeID
Group by E.EmployeeId, E.LastName, E.FirstName
go

El conjunto de resultados es el mismo, al analizar el Costo de Subárbol estimado es 0.0100238

Si comparamos los resultados, el uso de Join (Ver Post de Join) es menos costoso para SQL Server, y obviamente, recomendado.



2. — Listar las órdenes de los clientes de México y Francia (France)

Se necesita primero los còdigos de los clientes de México y Francia

select C.CustomerID from customers As C where Country = ‘Mexico’ or Country = ‘France’
go

Listado de las órdenes, note que la subconsulta se ha utilizado en la cláusula Where.

select * from Orders
where CustomerID in
(select C.CustomerID from customers As C where Country = ‘Mexico’ or Country = ‘France’)
go

3. — Incluir el nombre del Empleado y el nombre del Cliente

Para mostrar el Empleado
select Empleado = E.LastName + Space(1) + E.Firstname from Employees As E
go

Para mostrar el Cliente
Select C.Companyname from customers As C
go

Las instrucciones anteriores las incluiremos en la consulta como subconsultas, además se ha incluido el país para comprobar que son los clientes de México y France.

select O.OrderId, Format(O.OrderDate , ‘dd/MM/yyyy’) As ‘Fecha’,
(select Empleado = E.LastName + Space(1) + E.Firstname from Employees As E
where E.EmployeeID = O.EmployeeID) As ‘Empleado’,
(Select C.Companyname from customers As C
where C.CustomerId = O.CustomerId ) As ‘Cliente’,
(Select C.Country from customers As C
where C.CustomerId = O.CustomerId ) As ‘País’
from Orders As O
where CustomerID in
(select C.CustomerID from customers As C where Country = ‘Mexico’ or Country = ‘France’)
go