Sql server 简单加法的子查询?

Sql server 简单加法的子查询?,sql-server,Sql Server,我正在使用Northwind样本数据库 问题:显示订购数量等于或超过120的产品的产品名称。在SQL语句中使用非相关子查询 问题:如何将其作为非相关子查询编写?我创建的这个简单语句产生了正确的结果: SELECT [ProductName] FROM Products WHERE ([UnitsInStock] + [UnitsOnOrder] > = 120) 使用子查询会导致错误。这是我最好的尝试: SELECT [ProductName] FROM [dbo].[Products

我正在使用Northwind样本数据库

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

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

SELECT [ProductName] 
FROM Products
WHERE ([UnitsInStock] + [UnitsOnOrder] > = 120)
使用子查询会导致错误。这是我最好的尝试:

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

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


谢谢你的帮助

好的,你走对了路。问题来自A集合,请给我订购数量等于或大于120的集合b。因此,您的A集将仅为产品。b组为订购数量大于等于120的产品

从A中选择产品,其中productid在b中选择productid,其中b.数量>=120

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


您可以使用IN运算符筛选A集合

我会为您做功课

jk-jk-你现在的问题是你还没有意识到SQL可以是声明式的-你几乎可以从任何东西中进行选择,你只需要习惯如何去做

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

看看这个家伙:

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

您是否理解为什么您的查询不起作用。您知道子查询返回多行。使用中的问题是,无法将标量值与查询结果集的逻辑表进行比较。这是一个非常常见的错误。你应该养成的习惯是学会在互联网上搜索解决方案。关于非常常见的问题和错误的问题是不受欢迎的,并且往往因为缺乏努力而被否决和关闭

我相信这是最有可能为你的练习提供的解决方案。首先发布的派生表解决方案实际上不是子查询

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 ...;
有些事情需要注意

您应该始终对对象名称进行模式限定。 虽然主观,但在我看来,您应该避免在不需要时添加方括号作为对象名称分隔符。这只会使代码更难阅读。 一般来说,结果集应该是有序的。我增加了条款,但没有完成。 养成使用语句终止符的好习惯。最终它们将被要求。 我不知道Products表的主键是什么,但我假设它不是name列。我猜这是必要的ID替换。如果名称被声明为唯一且不可为null,则它可能是一个可接受的备选名称。
我将指出,这个问题和子查询要求说明了SQL编写的糟糕和迟钝。理解子查询很好;我不认为这是一种测试知识的特别有效的方法。

哈哈,是的,现在我们的速度有点慢,而这一次让我很烦!非常感谢。了解到SELECT、FROM和WHERE子句中可以存在子查询,我进行了实验,但在外部查询中没有表。@NoobMaster如果这为您解决了问题,请确保标记为已回答。我喜欢美味的feedbax感谢您的详细回复!使用中的问题是,无法将标量值与查询结果集的逻辑表进行比较。这个解释使我找到了解决这个奇怪问题的正确方向。谢谢你所有的附加说明!信息量很大。我不同意你的第三点。如果您有一个聚集索引,那么结果集总是按顺序排列的,更不用说为查询添加额外的开销是对CPU资源的浪费。如果它不需要订购,那为什么还要麻烦呢?