子查询两个select语句

时间:2016-03-31 08:15:36

标签: sql sql-server tsql

SELECT ProductID,
       UnitPrice                                               AS SalePrice,
       (SELECT ListPrice
        FROM   Production.Product
        WHERE  Product.ProductID = SalesOrderDetail.ProductID) AS ProductListPrice
FROM   Sales.SalesOrderDetail 

我对此查询有疑问。

当我使用主查询执行子查询时,子查询会运行。但是,当我单独执行子查询时,它不会执行。

它会抛出错误

  

多部分标识符" SalesOrderDetail.ProductID"不可能   界。

有人可以告诉他们为什么会这样吗?

3 个答案:

答案 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 JOINAPPLY,因为如果您有销售订单,您似乎总会有产品吗?

如果您不总是有产品,则只需将INNER替换为上面的LEFT加入。