Professional Documents
Culture Documents
(Transact-SQL)
SQL Server 2012
Otras versiones
4.
FROM Production.Product
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
-- OR
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN
(SELECT ProductModelID
FROM Production.ProductModel
WHERE Name LIKE 'Long-Sleeve Logo Jersey%');
GO
En el siguiente ejemplo se utiliza IN en una subconsulta correlativa o repetitiva. Se
trata de una consulta que depende de la consulta externa de sus valores. Se ejecuta
varias veces, una vez por cada fila que pueda seleccionar la consulta externa. Esta
consulta recupera una instancia del nombre y apellido de cada empleado cuya
bonificacin en la tabla SalesPerson sea de 5000.00 y cuyos nmeros de
identificacin coincidan en las tablas Employeey SalesPerson.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT p.LastName, p.FirstName
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN
(SELECT Bonus
FROM Sales.SalesPerson AS sp
WHERE e.BusinessEntityID = sp.BusinessEntityID);
GO
La subconsulta anterior de esta instruccin no se puede evaluar
independientemente de la consulta externa. Necesita el
valor Employee.EmployeeID, aunque este valor cambia a medida que el Motor
de base de datos de SQL Server examina diferentes filas de Employee.
Una subconsulta correlativa se puede usar tambin en la clusula HAVING de una
consulta externa. En este ejemplo se buscan los modelos cuyo precio mximo es
superior al doble de la media del modelo.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= ALL
(SELECT AVG(p2.ListPrice)
FROM Production.Product AS p2
WHERE p1.ProductModelID = p2.ProductModelID);
GO
En este ejemplo se utilizan dos subconsultas correlativas para buscar los nombres
de los empleados que han vendido un producto especfico.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT pp.LastName, pp.FirstName
FROM Person.Person pp JOIN HumanResources.Employee e
ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber = 'BK-M68B-42')));
GO
F.Usar GROUP BY
En este ejemplo se busca el total de cada pedido de venta de la base de datos.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Debido a la clusula GROUP BY, solo se devuelve una fila que contiene la suma de
todas las ventas por cada pedido de venta.
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
HAVING.
$2000000.00, utilice
GO
Si desea asegurarse de que hay al menos mil quinientos elementos para los
clculos de cada producto, use HAVING COUNT(*) > 1500 para eliminar los
productos que devuelven totales inferiores a 1500 elementos vendidos. La
consulta sera la siguiente:
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
OPTION
ProductResults contiene
/* INCORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO