Cuando escribimos un SELECT en ocasiones necesitamos usar un JOIN para relacionar a un conjunto de resultados con otro conjunto.
Notas:
- La subconsulta (o sea, el segundo SELECT ) se encuentra rodeada por paréntesis
- La subconsulta tiene un alias (que se encuentra después del AS y puede ser cualquiera, «ALIAS» es sólo un ejemplo)
- En la «CONDICION» debemos usar ese alias de la subconsulta
El patrón de subconsulta a nivel de columna suele ser bastante ineficiente, llevar esta subconsulta a nivel de un JOIN podría mejorar bastante, pero eso dependerá de como tengas configurados los índices.
Este ejemplo es muy sencillo, y solamente sirve para ilustrar el concepto. No es necesario usar una subconsulta para algo tan simple pero está ahí para que se entienda como funciona.
Creamos los datos:
DECLARE @Articulo TABLE (Articulo VARCHAR(100), ArticuloID INT);
DECLARE @EntradaCab TABLE (FechaEnvio DATE, GuiaID INT, TipoGuia INT, BodegaID INT);
DECLARE @EntradaDet TABLE (GuiaID INT, ArticuloID INT, Cantidad INT);
INSERT INTO @Articulo (Articulo, ArticuloID)
VALUES ('Bolsas',1),('Cajones',2);
INSERT INTO @EntradaCab (FechaEnvio, GuiaID, TipoGuia, BodegaID)
VALUES ('20190101',1,1,1), ('20190201',2,1,1), ('20190301',3,1,1), ('20190401',4,1,1), ('20190501',5,2,2),
('20190601',6,2,2);
INSERT INTO @EntradaDet (GuiaID, ArticuloID, Cantidad)
VALUES (1,1,10), (2,2,25), (3,2,25), (3,2,25), (1,2,25), (2,2,25), (3,2,25)
Obtenemos el total de Articulos por cada Guia:
SELECT
C.GuiaID,
C.FechaEnvio,
C.TipoGuia,
C.BodegaID,
D.Articulo,
D.TotalArticulos
FROM @EntradaCab C
RIGHT JOIN
(SELECT ED.GuiaID, A.Articulo, SUM(ED.Cantidad) AS TotalArticulos
FROM @EntradaDet ED
INNER JOIN @Articulo A ON A.ArticuloID = ED.ArticuloID
GROUP BY ED.GuiaID, A.Articulo) AS D
ON C.GuiaID = D.GuiaID
ORDER BY C.FechaEnvio, C.GuiaID
Las subconsultas en los JOINs es algo muy bueno porque nos abre muchas de posibilidades. Lo que hay que recordar es que la subconsulta debe estar rodeada por paréntesis y que debemos asignarle un alias. Solamente eso, el resto es igual a los demás JOINs que ya conocemos.
Leave a Reply