{"id":1757,"date":"2020-05-24T22:22:43","date_gmt":"2020-05-24T22:22:43","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=1757"},"modified":"2020-07-17T15:37:06","modified_gmt":"2020-07-17T15:37:06","slug":"subconsultas-correlaciondas-en-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=1757","title":{"rendered":"Subconsultas correlacionadas en SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"249\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas__D.png\" alt=\"\" class=\"wp-image-1758\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Subconsultas correlacionadas y no correlacionadas en SQL Server<\/h2>\n\n\n\n<p>En este art\u00edculo se va a explicar el uso de las subconsultas correlacionadas<br>y las subconsultas no correlacionadas. Dependiendo del dise\u00f1o de la base de datos siempre es conveniente probar diferentes formas de como hacer consultas complejas que impliquen varias tablas o an\u00e1lisis recursivo sobre la misma tabla.  Para informaci\u00f3n b\u00e1sica <a href=\"https:\/\/manualsqlserver.com\/?p=219\" target=\"_blank\" rel=\"noreferrer noopener\">Ver subconsultas<\/a>.<br>Para ejercicios ver Subconsultas <a href=\"https:\/\/manualsqlserver.com\/?p=395\" target=\"_blank\" rel=\"noreferrer noopener\">Caso 1<\/a>, <a href=\"https:\/\/manualsqlserver.com\/?p=757\" target=\"_blank\" rel=\"noreferrer noopener\">Caso 2<\/a> y <a href=\"https:\/\/manualsqlserver.com\/?p=805\" target=\"_blank\" rel=\"noreferrer noopener\">Caso 3<\/a><\/p>\n\n\n\n<!--more-->\n\n\n\n<p style=\"font-size:26px\"><strong>Subconsultas correlacionadas<\/strong><\/p>\n\n\n\n<p>Las subconsultas correlacionadas son aquellas que ejecutan fila a fila en una consulta principal con el resultado de una consulta interna. Para cada fila de la consulta principal se evalua la consulta interna, si el resultado es verdadero la fila de la consulta principal es incluida en el conjunto de resultados.<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:22px\"><strong>Select para consultas correlacionadas<\/strong><\/p>\n\n\n\n<p><strong>Sintaxis<\/strong><br>Select Campo1, Campo2, Campo3, \u2026 from Tabla1 Alias<br>Where Expresi\u00f3n Operador<br>(select Expresi\u00f3nN1 from Tabla2 where Expresi\u00f3n = Alias.Expresi\u00f3n)<\/p>\n\n\n\n<p>Note que hay una consulta principal y al filtrar usando la cl\u00e1usula Where se utiliza otra consulta (subconsulta interna).<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Subconsultas no correlacionadas<\/strong><\/p>\n\n\n\n<p>Las subconsultas no correlacionadas se ejecutan una sola vez y reportan un conjunto<br>de resultados en base a una consulta principal.<\/p>\n\n\n\n<p style=\"font-size:26px\"><strong>Ejemplos<\/strong><\/p>\n\n\n\n<p>Usando la base de datos Northwind<br>use Northwind<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p><strong>Listar los productos cuyo precio de venta se encuentro por encima del precio promedio de los productos de su categor\u00eda<\/strong><br>Primero calcular el precio promedio de los productos de categor\u00eda 1<br>select avg(P.UnitPrice) from Products As P where P.CategoryID = 1<br>go<br>El resultado es: 45.1854, este valor puede variar si los precios son diferentes, la base de datos Northwind ha sido utilizada en ejercicios que pueden variar los valores, compruebe los resultados.<br>Los productos de la categor\u00eda 1 ordenados por precio son los siguientes<br>select P.ProductID, P.ProductName, P.UnitPrice<br>from Products As P<br>where P.CategoryID = 1<br>order by P.UnitPrice desc<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_01.png\" alt=\"\" class=\"wp-image-1759\" width=\"657\" height=\"432\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_01.png 717w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_01-300x197.png 300w\" sizes=\"auto, (max-width: 657px) 100vw, 657px\" \/><\/figure>\n\n\n\n<p>Ahora listar los productos de esa categor\u00eda cuyo precio se encuentra por encima del promedio se incluir\u00e1 la consulta para el promedio de precios en la cl\u00e1usula where de la consulta principal, note que se est\u00e1 tomando como ejemplo los productos de la categor\u00eda 1.<\/p>\n\n\n\n<p>select P.ProductID, P.ProductName, P.UnitPrice<br>from Products As P<br>where P.UnitPrice ><br>(select avg(I.UnitPrice) from Products As I where I.CategoryID = 1)<br>and P.CategoryID = 1<br>order by P.UnitPrice desc<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_02.png\" alt=\"\" class=\"wp-image-1760\" width=\"599\" height=\"234\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_02.png 435w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_02-300x117.png 300w\" sizes=\"auto, (max-width: 599px) 100vw, 599px\" \/><figcaption>Productos con precios mayores al promedio cuyo valor es 45.1854 para este ejercicio.<\/figcaption><\/figure>\n\n\n\n<p>Ahora el resultado para todas las categorias, se incluir\u00e1 el c\u00f3digo de la categor\u00eda.<\/p>\n\n\n\n<p>select P.ProductID, P.ProductName, P.UnitPrice, P.CategoryID<br>from Products As P where P.UnitPrice ><br>(select avg(I.UnitPrice) from Products As I where I.CategoryID = P.CategoryID)<br>order by P.CategoryID, P.UnitPrice desc<br>go<\/p>\n\n\n\n<p>Note los productos de la categor\u00eda 1.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_03.png\" alt=\"\" class=\"wp-image-1761\" width=\"697\" height=\"859\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_03.png 696w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_03-243x300.png 243w\" sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><figcaption>Productos de todas las categor\u00edas con los precios mayyores al promedio por categor\u00eda.<\/figcaption><\/figure>\n\n\n\n<p><strong>Para comprobar el resultado de la consulta anterior, utilizaremos como ejemplo los productos de la categor\u00eda 2.<\/strong><br>Calcular el precio promedio de los productos de categor\u00eda 2<br>select avg(P.UnitPrice) from Products As P where P.CategoryID = 2<br>go<br>Resultado: 24.9147<br>Para ver los resultados listaremos los registros de la categor\u00eda 2<br>select P.ProductID, P.ProductName, P.UnitPrice<br>from Products As P<br>where P.UnitPrice ><br>(select avg(I.UnitPrice) from Products As I where I.CategoryID = 2)<br>and P.CategoryID = 2<br>order by P.UnitPrice desc<br>go<br>Note que los cinco registros que aparecen tienen el precio mayor al promedio de los precios de la categor\u00eda 2 (Valor de 24.9147) y coinciden con los productos de categor\u00eda 2 que aparecen en el listado de precios de todas las categor\u00edas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_05-1024x622.png\" alt=\"\" class=\"wp-image-1762\" width=\"733\" height=\"445\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_05-1024x622.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_05-300x182.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_05-768x467.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_05.png 1412w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><figcaption>Listado de productos de todas las categor\u00edas y de la categor\u00eda 2.<\/figcaption><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Convertir la subconsulta correlacionada a una consulta con Join<\/strong><\/p>\n\n\n\n<p>Para mas informaci\u00f3n ver <a href=\"https:\/\/manualsqlserver.com\/?p=215\" target=\"_blank\" rel=\"noreferrer noopener\">Consultas de varias tablas con Joins<\/a><br>select P.ProductID, P.ProductName, P.UnitPrice, P.CategoryId<br>from Products As P<br>join (select I.CategoryId, avg(I.UnitPrice) As Promedio from Products As I<br>group by I.CategoryId) As Prom<br>on P.CategoryId = Prom.CategoryId<br>where P.UnitPrice > Prom.Promedio<br>order by P.CategoryID, P.UnitPrice desc<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p>Listar los productos que tengan stock inferior al promedio de stocks por categor\u00eda. Incluir el nombre del proveedor (Suppliers) y la descripci\u00f3n de la categor\u00eda, la descripci\u00f3n de la categor\u00eda se ha inclu\u00eddo con una subconsulta regular.<\/p>\n\n\n\n<p>select P.ProductID As &#8216;C\u00f3digo&#8217;,<br>P.ProductName As &#8216;Descripci\u00f3n&#8217; ,<br>P.UnitPrice As &#8216;Precio&#8217;,<br>P.UnitsInStock As &#8216;Stock&#8217;,<br>(select S.CompanyName from Suppliers As S<br>where S.SupplierID = P.SupplierID) As &#8216;Proveedor&#8217;,<br>P.CategoryID As &#8216;C\u00f3d. Categor\u00eda&#8217;,<br>(select C.CategoryName from Categories As C<br>where C.CategoryID = P.CategoryID) As &#8216;Categor\u00eda&#8217;<br>from Products As P<br>where P.UnitsInStock &lt;<br>(select avg(I.UnitsInStock) from Products As I<br>where I.CategoryID = P.CategoryID)<br>order by P.CategoryID, P.UnitsInStock desc<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_06-1024x671.png\" alt=\"\" class=\"wp-image-1766\" width=\"774\" height=\"507\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_06-1024x671.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_06-300x197.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_06-768x503.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_06.png 1202w\" sizes=\"auto, (max-width: 774px) 100vw, 774px\" \/><\/figure>\n\n\n\n<p>Mostrando el plan de ejecuci\u00f3n estimado el costo es: 0.0453711<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_07_-1024x350.png\" alt=\"\" class=\"wp-image-1763\" width=\"748\" height=\"256\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_07_-1024x350.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_07_-300x102.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_07_-768x262.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_07_-1536x524.png 1536w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_07_.png 1576w\" sizes=\"auto, (max-width: 748px) 100vw, 748px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Convirtiendo la misma consulta con Joins<\/strong><\/p>\n\n\n\n<p>select P.ProductID As &#8216;C\u00f3digo&#8217;,<br>P.ProductName As &#8216;Descripci\u00f3n&#8217; ,<br>P.UnitPrice As &#8216;Precio&#8217;,<br>P.UnitsInStock As &#8216;Stock&#8217;,<br>S.CompanyName As &#8216;Proveedor&#8217;,<br>P.CategoryID As &#8216;C\u00f3d. Categor\u00eda&#8217;,<br>C.CategoryName As &#8216;Categor\u00eda&#8217;<br>from Products As P<br>join Categories As C on P.CategoryID = C.CategoryID<br>join Suppliers As S on P.SupplierID = S.SupplierID<br>where P.UnitsInStock &lt;<br>(select avg(I.UnitsInStock) from Products As I<br>where I.CategoryID = P.CategoryID)<br>order by P.CategoryID, P.UnitsInStock desc<br>go<\/p>\n\n\n\n<p>Mostrando el plan de ejecuci\u00f3n estimado el costo es: 0.0482638<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_09-1024x410.png\" alt=\"\" class=\"wp-image-1764\" width=\"750\" height=\"300\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_09-1024x410.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_09-300x120.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_09-768x307.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_09.png 1360w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n\n\n\n<p>La consulta usando subconsulta para mostrar los nombres del proveedor y de la categor\u00eda es mas r\u00e1pida.<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 3<\/strong><\/p>\n\n\n\n<p><strong>Listar los clientes que tienen registrada por lo menos tres ordenes<\/strong><\/p>\n\n\n\n<p>Select C.CustomerId As &#8216;C\u00f3d. Cliente&#8217;, C.CompanyName As &#8216;Cliente&#8217;,<br>(Select count(Ord.CustomerID) from Orders As Ord<br>where Ord.CustomerID = C.CustomerID) As &#8216;Cantidad de \u00d3rdenes&#8217;<br>from Customers As C<br>where exists<br>(Select distinct O.CustomerId from Orders As O<br>where O.CustomerID = C.CustomerID)<br>and<br>(Select count(Ord.CustomerID) from Orders As Ord<br>where Ord.CustomerID = C.CustomerID) >= 3<br>order by [Cantidad de \u00d3rdenes]<br>go<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_10.png\" alt=\"\" class=\"wp-image-1765\" width=\"696\" height=\"630\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_10.png 790w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_10-300x272.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_SubconsultasCorrelacionadas_10-768x696.png 768w\" sizes=\"auto, (max-width: 696px) 100vw, 696px\" \/><\/figure>\n\n\n\n<p>En este ejercicio se ha incluido una subconsulta regular para la cantidad de \u00f3rdenes y la misma se ha utilizado para el filtro que indica que sean como m\u00ednimo 3 \u00f3rdenes.<br>La subconsulta correlacionada es la que se usa para listar los Id de los clientes que tienen \u00f3rdenes registradas en el filtro usando el operador exists. <strong>(Select distinct O.CustomerId from Orders As O<br>where O.CustomerID = C.CustomerID)<\/strong><\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Subconsultas correlacionadas y no correlacionadas en SQL Server En este art\u00edculo se va a explicar el uso de las subconsultas correlacionadasy las subconsultas no correlacionadas. Dependiendo del dise\u00f1o de la base de datos siempre es conveniente probar diferentes formas de como hacer consultas complejas que impliquen varias tablas o an\u00e1lisis recursivo sobre la misma tabla. &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=1757\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1758,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,231],"tags":[185,51,55],"class_list":["post-1757","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-consultasdedatos","category-subconsultas","tag-correlacionada","tag-select","tag-subconsultas","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1757"}],"version-history":[{"count":2,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1757\/revisions"}],"predecessor-version":[{"id":1769,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1757\/revisions\/1769"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1758"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}