相关的子查询是否像循环一样工作



我正在学习培训套件考试 70 461,但下一个查询不被理解:

SELECT 
     categoryid
     ,productid
     ,productname
     ,unitprice
FROM Production.Products AS P1
WHERE 
     unitprice =
         (SELECT MIN(unitprice)
         FROM Production.Products AS P2
         WHERE P2.categoryid = P1.categoryid);

这是如何工作的?
如果我没有 WHERE 子句,那么我将得到 1 个结果,如下所示:

 SELECT 
      categoryid
      ,productid
      ,productname
      ,unitprice
 FROM Production.Products AS P1
 WHERE unitprice =
      (SELECT MIN(unitprice)
      FROM Production.Products AS P2);

然后

categoryid productid productname unitprice
----------- ---------- -------------- ----------
   4          33    Product ASTMN  2.50

但是当执行第一个查询时,我得到:

categoryid productid productname unitprice
----------- ---------- -------------- ----------
1             24    Product QOGNU   4.50
2             3     Product IMEHJ   10.00
3             19     Product XKXDO  9.20
4             33     Product ASTMN  2.50
5             52     Product QSRXF  7.00
6             54     Product QAQRL  7.45
7             74     Product BKAZJ  10.00
8             13     Product POXFU  6.00

我不明白。
这是如何工作的?
它像循环中的循环吗?
类别ID 1 哪个是外部查询,然后循环内部查询以获取类别ID 1?8 倍到类别 ID 8
如果不理解这一点,我就无法继续前进。
正如本书所见,我正在使用 SQL Server with Northwind

相关子查询是使用外部查询中的值的子查询。

请参阅此处的示例 http://en.wikipedia.org/wiki/Correlated_subquery

相关子查询是由主查询(outer query(引用的内部查询,使得内部查询被视为被重复执行。

共同相关与嵌套子查询。

普通子查询和 Co 相关子查询之间的技术区别是:

    循环:主查询下的共同相关子查询
  1. 循环;而嵌套不是;因此,共同相关的子查询在主查询的每次迭代中执行。而在嵌套查询的情况下;子查询首先执行,然后执行外部查询。因此,最大否。的执行是 NXM 用于相关子查询和 N+M 用于子查询。

  2. 依赖关系(内部到外部与外部
  3. 到内部(:在协同相关子查询的情况下,内部查询依赖于外部查询进行处理,而在普通子查询中,外部查询依赖于内部查询。

3.性能:使用协同相关子查询性能会降低,因为它执行 NXM 迭代而不是 N+M 迭代。 ̈ 协同相关子查询执行。

有关示例的更多信息:

http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-Sql-Sub-Queries-Nested-Co-related.html

在您的第一个查询中,

SELECT categoryid, productid, productname, unitprice
FROM Production.Products AS P1
WHERE unitprice =
(SELECT MIN(unitprice)
FROM Production.Products AS P2
WHERE P2.categoryid = P1.categoryid);

查询

SELECT MIN(unitprice)
FROM Production.Products AS P2
WHERE P2.categoryid = P1.categoryid

products表中each类别选择最低价格,它将返回产品表中的所有records,单价将是每行的minimum价格。

在第二个查询中,

 SELECT categoryid, productid, productname, unitprice
 FROM Production.Products AS P1
 WHERE unitprice =
 (SELECT MIN(unitprice)
 FROM Production.Products AS P2)

查询

SELECT MIN(unitprice)
 FROM Production.Products AS P2 

返回单个值。 在您的情况下,它是2.50

您的查询变为

 SELECT categoryid, productid, productname, unitprice
 FROM Production.Products AS P1
 WHERE unitprice = 2.50

所以它将单独返回单行。希望现在清楚了

相关内容

  • 没有找到相关文章

最新更新