Las subconsultas son una herramienta poderosa en SQL Server que te permiten controlar dinámicamente los registros afectados o seleccionados por una declaración T-SQL. Una subconsulta es una declaración SELECT que está anidada dentro de otra declaración T-SQL. Se puede utilizar en varias partes de una consulta, como la lista de columnas, la cláusula WHERE, la cláusula FROM y la cláusula HAVING.
Usando una subconsulta en la lista de columnas
Un uso común de una subconsulta es recuperar información específica junto con los resultados de una consulta. Por ejemplo, es posible que desees encontrar el último OrderID y OrderDate para el último pedido que se envió a París, así como el OrderDate para el último pedido enviado independientemente de la ShipCity. Aquí tienes un ejemplo:
SELECT TOP 1 OrderId, CONVERT(char(10), OrderDate, 121) Último_Pedido_Paris,
(SELECT CONVERT(char(10), MAX(OrderDate), 121) FROM Orders) Último_OrderDate,
DATEDIFF(dd, OrderDate, (SELECT MAX(OrderDate) FROM Orders)) Diferencia_Días
FROM Orders
WHERE ShipCity = 'Paris'
ORDER BY OrderDate DESC
En este ejemplo, utilizamos dos subconsultas. La primera subconsulta recupera el OrderDate para el último pedido enviado independientemente de ShipCity, y la segunda subconsulta calcula el número de días entre los dos OrderDates diferentes. La primera subconsulta se utiliza para devolver un valor de columna en el conjunto de resultados final, mientras que la segunda subconsulta se utiliza como parámetro en la función DATEDIFF.
Usando una subconsulta en la cláusula WHERE
Una subconsulta también se puede utilizar para controlar los registros devueltos por una declaración SELECT al controlar qué registros pasan las condiciones de una cláusula WHERE. Por ejemplo, es posible que desees recuperar una lista de países donde viven los clientes, pero no hay proveedores ubicados en ese país. Aquí tienes un ejemplo:
SELECT DISTINCT country
FROM Customers
WHERE country NOT IN (SELECT DISTINCT country FROM Suppliers)
En este ejemplo, la subconsulta devuelve una lista de países donde se encuentran los proveedores. La consulta principal luego recupera los países donde viven los clientes pero no se encuentran en los resultados de la subconsulta. Esto puede ser útil para dirigirse a países específicos para proveedores adicionales o esfuerzos de marketing.
Usando una subconsulta en la cláusula FROM
Una subconsulta se puede utilizar en la cláusula FROM de una declaración SELECT para tratarla como una tabla. Esto puede ser útil para reducir el tamaño del conjunto que necesita ser unido, mejorando el rendimiento de la consulta. Aquí tienes un ejemplo:
SELECT au_lname, au_fname, title
FROM (
SELECT au_lname, au_fname, au_id
FROM authors
WHERE state = 'CA'
) AS a
JOIN titleauthor ta ON a.au_id = ta.au_id
JOIN titles t ON ta.title_id = t.title_id
En este ejemplo, la subconsulta selecciona solo los registros de autor con una columna de estado igual a ‘CA’. Los resultados de la subconsulta se tratan luego como una tabla con el alias ‘a’, que se puede utilizar en las cláusulas JOIN para hacer referencia a las columnas de la subconsulta.
Usando una subconsulta en la cláusula HAVING
Una subconsulta también se puede utilizar en la cláusula HAVING para filtrar los resultados de una consulta GROUP BY. Por ejemplo, es posible que desees encontrar el número de libros publicados por editoriales que no se encuentran en el estado de California. Aquí tienes un ejemplo:
SELECT pub_name, COUNT(*) bookcnt
FROM titles t
JOIN publishers p ON t.pub_id = p.pub_id
GROUP BY pub_name
HAVING p.pub_name IN (SELECT pub_name FROM publishers WHERE state <> 'CA')
En este ejemplo, la subconsulta devuelve los valores de pub_name para todas las editoriales que tienen un valor de estado diferente de ‘CA’. La condición HAVING luego verifica si el pub_name está en el conjunto devuelto por la subconsulta, lo que te permite filtrar los resultados en función de esta condición.
Conclusión
Las subconsultas son un concepto valioso en SQL Server que te permiten lograr criterios de selección complejos en una sola declaración T-SQL. Pueden ayudar a evitar el uso de tablas temporales y cursores, y dependiendo de la consulta, pueden mejorar el rendimiento al reducir el número de registros que deben procesarse. Comprender cómo utilizar las subconsultas de manera efectiva puede mejorar en gran medida tus habilidades en SQL Server.
En el próximo artículo, exploraremos las subconsultas correlacionadas y sus aplicaciones en SQL Server.