相关子查询如何通过外子查询“循环”?

时间:2016-12-08 22:50:08

标签: tsql sql-server-2012

我很难理解在为外部查询中的每一行返回一个集合时,内部子查询(引用外部子查询)的确切方式。我知道它做了什么,但不知道它做了什么。

现在,我把它当作一个“嵌套循环”(来自程序员背景,但从未使用过数据库)。但是我在遵循逐步逻辑方面遇到了困难。

在任何编程语言的典型“for循环”中,我都知道外部循环将计算并执行嵌套的操作。这对我来说很有意义。但是对于下面的tsql示例,我只是没有看到为什么内部查询将为外部查询中的每一行“运行”。或者甚至是吗?

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);

现在根据从中获取此样本的书(使用TSQL2012数据库),相关性是谓词P2.categoryid = P1.categoryid。 我理解,P1.category ID将循环遍历categoryid中的所有行,并返回每个行的最小单位价格。

但在我看来,我不明白查询如何确定P1.categoryid将要保存的值。

1 个答案:

答案 0 :(得分:1)

对于外部查询中的每一行(其中P1是),P1.categoryid只能有一个值。所以子查询只检查p2中的那些行(子查询中的Products表),其中categoryid与外部查询正在处理的单行的categoryid相同。它与连接完全相同。查询处理器如何合并这两组记录取决于查询处理器。有几种不同的合并技术可用。

实际上,由于子查询位于where子句中,它只是过滤结果集以消除单位价格 的所有行中的最低单价产品类别。即它选择每个类别中价格最低的产品[s]。