
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
