SELECT ProductID,
UnitPrice AS SalePrice,
(SELECT ListPrice
FROM Production.Product
WHERE Product.ProductID = SalesOrderDetail.ProductID) AS ProductListPrice
FROM Sales.SalesOrderDetail
我对此查询有疑问。
当我使用主查询执行子查询时,子查询会运行。但是,当我单独执行子查询时,它不会执行。
它会抛出错误
多部分标识符" SalesOrderDetail.ProductID"不可能 界。
有人可以告诉他们为什么会这样吗?
答案 0 :(得分:0)
这是因为“SalesOrderDetail”是外部查询的表,您将它“传递”到子查询。
此外,如果子查询返回的值更多,则查询将失败。
(更好)等价物是:
SELECT ProductID,
UnitPrice AS SalePrice
ListPrice AS ProductListPrice
FROM Production.Product
INNER JOIN Sales.SalesOrderDetail
ON Product.ProductID = SalesOrderDetail.ProductID
答案 1 :(得分:0)
执行主查询时,它会通过Product.ProductID
提供SalesOrderDetail.ProductID
的所有值。当你在它自己的子查询上运行时,它没有任何东西可以提供这些值。
如果您想在其上运行子查询,那么您可以,但是您需要稍微更改它以提供您自己的值。像这样:
SELECT ListPrice FROM Production.Product
WHERE Product.ProductID IN (1, 2, 3)
其中1,2和3是您要返回的产品清单价格的ID。
答案 2 :(得分:0)
您作为列列表一部分的查询通常可以"查看"主查询中的SalesOrderDetail表。当您单独运行查询时,没有名为SalesOrderDetail的表,因此当它试图找到要检索ProductId列的表时,它无法找到它并为您提供错误。
如果您的Production.Product表只有1行需要ProductID,那么您的主查询将会起作用 - 可能是因为它已经使用IDENTITY列或类似的ID覆盖了它。但是对于将来的查询,您应该知道,如果列列表中的查询可以返回多于1个结果,您将获得以下内容:
"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."
您可以在不使用子查询的情况下轻松编写查询:
SELECT ProductID,
UnitPrice AS SalePrice,
Product.ListPrice AS ProductListPrice
FROM Sales.SalesOrderDetail
INNER JOIN Production.Product ON Product.ProductID = SalesOrderDetail.ProductID
您在这里不需要LEFT JOIN
或APPLY
,因为如果您有销售订单,您似乎总会有产品吗?
如果您不总是有产品,则只需将INNER
替换为上面的LEFT
加入。