我正在学习培训套件考试 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 相关子查询之间的技术区别是:
- 循环:主查询下的共同相关子查询
循环;而嵌套不是;因此,共同相关的子查询在主查询的每次迭代中执行。而在嵌套查询的情况下;子查询首先执行,然后执行外部查询。因此,最大否。的执行是 NXM 用于相关子查询和 N+M 用于子查询。
依赖关系(内部到外部与外部到内部(:在协同相关子查询的情况下,内部查询依赖于外部查询进行处理,而在普通子查询中,外部查询依赖于内部查询。
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
所以它将单独返回单行。希望现在清楚了