子查询差异混乱

时间:2018-03-10 21:59:44

标签: sql sql-server

在此代码中,我们要求特定供应商的产品的最低价格,但我不明白为什么我们必须为外部查询设置别名。

QUERY 1: - 返回UnitPrice最小的所有记录。

SELECT SupplierID
    ,ProductName
    ,UnitPrice
FROM Products
WHERE UnitPrice = (
        SELECT MIN(UnitPrice)
        FROM Products
        WHERE SupplierID = Products.SupplierID
        )

QUERY 2: - 返回每个供应商的最低价格记录。

SELECT SupplierID
    ,ProductName
    ,UnitPrice
FROM Products AS p1
WHERE UnitPrice = (
        SELECT MIN(UnitPrice)
        FROM Products
        WHERE SupplierID = p1.SupplierID
        )

这段代码是递归的吗?

我正在使用Northwind示例数据库。

2 个答案:

答案 0 :(得分:1)

在第一个中,子查询中的supplierID指的是子查询的Products表,它没有引用外部表。因此,执行一次以获得所有供应商ID中的最小单价。这基本上是一个嵌套的子查询。

在第二个中,子查询使用p1.supplierID引用外部查询,因此将在外部查询中为每个supplierID执行子查询。它将获得每个供应商的最低单价。这是一个相关的子查询。

More info on subqueries

答案 1 :(得分:1)

QUERY 1: - 返回UnitPrice最小全部 UnitPrice

的所有记录

SELECT SupplierID
    ,ProductName
    ,UnitPrice
FROM Products
WHERE UnitPrice = (
        SELECT MIN(UnitPrice)
        FROM Products
        WHERE SupplierID = Products.SupplierID
        )

您可以从子查询中完全删除WHERE SupplierID = Products.SupplierID,因为它对您的最终结果没有影响。

以这种方式思考(返回UnitPrice = 1)的所有记录:

SELECT SupplierID
    ,ProductName
    ,UnitPrice
FROM Products
WHERE UnitPrice = ('1')

QUERY 2: - 返回每个供应商的最低价格记录。

SELECT SupplierID
    ,ProductName
    ,UnitPrice
FROM Products AS p1
WHERE UnitPrice = (
        SELECT MIN(UnitPrice)
        FROM Products
        WHERE SupplierID = p1.SupplierID
        )

可以这样想,"对于每个p1.SupplierID(这是Products表中的每个供应商),返回UnitPrice所在的任何记录该特定供应商必须提供的最低价格"

[DEMO HERE WITH SAMPLE DATA]