Subconsultas como tabla derivada

Subconsultas como tabla derivada

  • Las subconsultas como tabla derivada son instrucciones select que sirven como conjunto de resultados desde donde se realiza una instrucción select externa.
  • Para entender mejor debemos recordar que en una subconsulta podemos reconocer como mínimo dos instrucciones Select, una consulta externa que dentro de ella tiene una o mas instrucciones select que son las consultas internas. (Ver Subconsultas)

Las subconsultas se pueden agrupar de la siguiente forma

1. Subconsultas que devuelven un único valor.
2. Subconsultas que devuelven un conjunto de datos.
3. Subconsultas como tablas derivadas.

En este artículo se verá como usar las subconsultas como tablas derivadas.

La estructura de las subconsultas como tablas derivadas tienen una estructura similar a la siguiente instrucción

select TablaDerivada.Campo1, TablaDerivada.Campo2, TablaDerivada.Campo3
from (select * from Tabla) As TablaDerivada

Note que después de la instrucción From se ha especificado una instrucción select que es la que se considera una tabla derivada.

Sugerencia: el conjunto de resultados de subconsultas se pueden obtener también usando Joins (Ver Joins), se sugiere ver el plan de ejecución para elegir la que tenga menor costo.



Ejercicios

Usando Northwind
use Northwind
go

Ejercicio 1
Mostrar los códigos y los nombres de los proveedores (Suppliers)

select P.SupplierID, P.CompanyName
from (select * from Suppliers) As P
go

Note que primero se creó una consulta con los proveedores a la que se le asignó el alias P, luego esa consultas sirvió como tabla derivada para a partir de su conjunto de resultados sólo se muestre los códigos (SupplierID) y el nombre de la compañía (CompanyName)

Ejercicio 2
Mostrar detalles de compras de los clientes. Primero se va a crear una instrucción que tenga el detalle de las ventas incluyendo los datos del cliente, el producto y la orden. A partir de esa instrucción obtener detalles de ventas. 

La instrucción select que servirá como subconsulta de tabla derivada es la siguiente:

select C.CustomerID As ‘Cód. Cliente’, C.CompanyName As ‘Cliente’,
O.OrderID As ‘Nº Orden’, Year(O.OrderDate) As ‘Año’,
DATENAME(MM,O.OrderDate) As ‘Mes’,
P.ProductName As ‘Producto’, OD.Quantity As ‘Cantidad’,
OD.UnitPrice As ‘Precio Venta’
from Customers As C
join Orders As O on C.CustomerID = O.CustomerID
join [Order Details] As OD on O.OrderID = Od.OrderID
join Products As P on OD.ProductID = P.ProductID
go

La instrucción anterior servirá como conjunto de resultados para las subconsultas como tabla derivada, a esta consulta se le asignará el alias Co de Compras.

2.1. Listar las compras del cliente con código ALFKI.

select Co.[Nº Orden], Co.Producto, Co.Cantidad, Co.[Precio Venta]
from (select C.CustomerID As ‘Cód. Cliente’, C.CompanyName As ‘Cliente’,
O.OrderID As ‘Nº Orden’, Year(O.OrderDate) As ‘Año’,
DATENAME(MM,O.OrderDate) As ‘Mes’,
P.ProductName As ‘Producto’, OD.Quantity As ‘Cantidad’,
OD.UnitPrice As ‘Precio Venta’
from Customers As C
join Orders As O on C.CustomerID = O.CustomerID
join [Order Details] As OD on O.OrderID = Od.OrderID
join Products As P on OD.ProductID = P.ProductID) As Co
where Co.[Cód. Cliente] = ‘ALFKI’
go

2.2. Listar las compras de agosto de 1997

select Co.[Cód. Cliente], Co.Cliente, Co.[Nº Orden], Co.Producto,
Co.Cantidad, Co.[Precio Venta], Co.Año , Co.Mes
from (select C.CustomerID As ‘Cód. Cliente’, C.CompanyName As ‘Cliente’,
O.OrderID As ‘Nº Orden’, Year(O.OrderDate) As ‘Año’,
DATENAME(MM,O.OrderDate) As ‘Mes’,
P.ProductName As ‘Producto’, OD.Quantity As ‘Cantidad’,
OD.UnitPrice As ‘Precio Venta’
from Customers As C
join Orders As O on C.CustomerID = O.CustomerID
join [Order Details] As OD on O.OrderID = Od.OrderID
join Products As P on OD.ProductID = P.ProductID) As Co
where Co.Año = 1997 and co.Mes = ‘Agosto’
go