简单添加的子查询



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

问题:显示订购数量等于或超过120的产品的产品名称。在SQL语句中使用不相关的子查询。

问题:如何将其作为一个不相关的子查询来编写?我创建的这个简单语句产生了正确的结果:

SELECT [ProductName] 
FROM Products
WHERE ([UnitsInStock] + [UnitsOnOrder] > = 120)

我使用子查询会导致错误。这是我最好的尝试:

SELECT [ProductName]
FROM [dbo].[Products]
WHERE 120 < = 
(SELECT [UnitsInStock] + [UnitsOnOrder]
FROM Products)

错误:

子查询返回了多个值。当子查询跟在=、!=、<lt;=>gt;=或者当子查询用作表达式时。

您明白为什么您的查询不起作用吗?您知道子查询返回多行。使用时的问题是无法将标量值与逻辑表(查询的结果集(进行比较。这是一个非常常见的错误。

我相信这是最有可能用于您练习的解决方案。派生表解决方案(首先发布(实际上不是一个子查询。

select prd.ProductName 
from dbo.Products as prd
where prd.ID in (select px.ID from dbo.Products as px 
where px.UnitsInStock + px.UnitsOnOrder > = 120)
order by ...;

有些事情需要注意。

  • 您应该始终对对象名称进行模式限定
  • 尽管主观,IMO您应该避免在不需要方括号作为对象名称分隔符时添加方括号。这只会使代码更难阅读
  • 通常情况下,应对结果集进行排序。我增加了这一条款,但没有完成
  • 养成使用语句终止符的好习惯。最终他们将被要求
  • 我不知道Products表的主键是什么,但我认为它不是name列。我猜这是ID-根据需要更换。如果名称被声明为唯一且不可为null,则它可能是一个可接受的替代名称

您面临的问题是,您还没有意识到SQL可以是声明性的-您几乎可以从任何东西中进行选择,您只需要习惯如何做到这一点。

另外,您得到的错误是,您将where子句子查询视为相关的。

检查此项:

SELECT ProductName 
FROM
(
SELECT [ProductName] 
FROM Products p
WHERE ([UnitsInStock] + [UnitsOnOrder] > = 120)
) x

好的,所以你走的是正确的道路。问题来自A集合,给我订单数量等于或大于120的集合b。所以你的A组只会是产品。b集合将是订购数量>120

从A中选择产品,其中producted in(从b中选择producted,其中b.quantity>=120(

A是产品表,b是与产品和数量相关联的订单表。

您可以使用IN运算符来过滤A集

最新更新