仅使用SELECTs的SQL子查询

仅使用SELECTs的SQL子查询,sql,sql-server,Sql,Sql Server,我只需要使用选择和聚合函数编写包含子查询的查询,例如: select distinct m_name from MANUFACT where m_id in (select TOP 1 m_id from PRODUCT where p_id = (select p_id from PRODUCT where p_

我只需要使用选择和聚合函数编写包含子查询的查询,例如:

select distinct m_name
from MANUFACT
where m_id in (select TOP 1 m_id
                from PRODUCT
                where p_id = (select p_id
                              from PRODUCT
                              where p_desc = 'Bronze Sculpture'));
问题是关于类似于此的查询,但使用SUM。我掌握的数据如下: 表演者:

sp_id | sp_name
---------------
 10   | Jones
 39   | Matsu
 23   | Atsuma
表格销售:

sp_id | qty
-----------
  10  |  20
  23  |  30
  10  |  10
  39  |  20
等等


任务是返回产品总数为的sp_名称。您可以使用相关子查询:

SELECT q.sp_name
  FROM( SELECT sp_name,
              (SELECT SUM(qty) FROM sale s WHERE s.sp_id = p.sp_id ) AS qty
          FROM SPERSON p
         GROUP BY sp_name
          ) q
 GROUP BY q.sp_name
 HAVING SUM(q.qty) <= 75

大多数情况下,不建议使用相关子查询,因为相关子查询可能包含对外部查询的引用,从而为外部查询的每一行生成不同的结果。但我建议使用它作为替代方法,这取决于您不允许使用JOIN的情况。顺便说一句,使用JOIN更简单。

您可以使用相关子查询:

SELECT q.sp_name
  FROM( SELECT sp_name,
              (SELECT SUM(qty) FROM sale s WHERE s.sp_id = p.sp_id ) AS qty
          FROM SPERSON p
         GROUP BY sp_name
          ) q
 GROUP BY q.sp_name
 HAVING SUM(q.qty) <= 75

大多数情况下,不建议使用相关子查询,因为相关子查询可能包含对外部查询的引用,从而为外部查询的每一行生成不同的结果。但我建议使用它作为替代方法,这取决于您不允许使用JOIN的情况。顺便说一句,使用JOIN更简单。

您可以尝试从不同的方向处理问题。 创建查询以计算按sp_id分组的总数量

过滤数量小于或等于75的人员id

SELECT s.sp_id, SUM(s.qty)
FROM SALE s
GROUP BY s.sp_id
HAVING SUM(s.qty) <= 75
因为不允许联接,所以将名称作为子查询注入

SELECT 
  (SELECT p.sp_name FROM SPERSON p WHERE p.sp_id = s.sp_id) AS name
FROM SALE s
GROUP BY s.sp_id
HAVING SUM(s.qty) <= 75

你可以试着从不同的方向来解决问题。 创建查询以计算按sp_id分组的总数量

过滤数量小于或等于75的人员id

SELECT s.sp_id, SUM(s.qty)
FROM SALE s
GROUP BY s.sp_id
HAVING SUM(s.qty) <= 75
因为不允许联接,所以将名称作为子查询注入

SELECT 
  (SELECT p.sp_name FROM SPERSON p WHERE p.sp_id = s.sp_id) AS name
FROM SALE s
GROUP BY s.sp_id
HAVING SUM(s.qty) <= 75

您的查询几乎是正确的。专注于你的总结。把逻辑拉出来,自己运行。您需要合计数量,但需要在分组后过滤行。使用HAVING子句来实现这一点。当您完成该工作时,您可以将其应用于当前查询。建议-当您拉出该子查询以处理它时,请在选择列表中包含sumqty as tqty的值,以便您可以查看总数量,以验证您的逻辑是否正确。当然,当您将它用作子查询时,您需要删除它。我已经尝试了很多次,包括在select中使用having的sum结果,但问题是它不允许我在后续步骤中使用提取的函数结果作为条件,它给了我同样的错误:从SPERSON中选择sp_名称,其中sp_id在SelectSP_id从SALE中选择sp_id,其中数量在SelectSumQTY中作为qtyy组,sp_id有qtyy,您正在与聚合进行斗争-这是第一个问题。除非您理解聚合和分组方式,并拥有子句,否则您无法真正实现您的目标。最内部的子查询格式不正确-它没有从表中选择。这是最大的问题。我给你一个例子来证明你并不总是需要在选择列表中生成一个聚合作为一列来使用。非常感谢!现在这很有意义:您的查询几乎是正确的。专注于你的总结。把逻辑拉出来,自己运行。您需要合计数量,但需要在分组后过滤行。使用HAVING子句来实现这一点。当您完成该工作时,您可以将其应用于当前查询。建议-当您拉出该子查询以处理它时,请在选择列表中包含sumqty as tqty的值,以便您可以查看总数量,以验证您的逻辑是否正确。当然,当您将它用作子查询时,您需要删除它。我已经尝试了很多次,包括在select中使用having的sum结果,但问题是它不允许我在后续步骤中使用提取的函数结果作为条件,它给了我同样的错误:从SPERSON中选择sp_名称,其中sp_id在SelectSP_id从SALE中选择sp_id,其中数量在SelectSumQTY中作为qtyy组,sp_id有qtyy,您正在与聚合进行斗争-这是第一个问题。除非您理解聚合和分组方式,并拥有子句,否则您无法真正实现您的目标。最内部的子查询格式不正确-它没有从表中选择。这是最大的问题。我给你一个例子来证明你并不总是需要在选择列表中生成一个聚合作为一列来使用。非常感谢!这在现在看来是有道理的:虽然这似乎第四次起作用是一种魅力,对吧,它写得很糟糕,不能作为一种学习工具。OP是一名学生,给出一个没有解释的工作答案对教学没有什么帮助。不管怎样,你介意试着给我一个关于小组外部参考的答案吗?在我的例子中,没有找到导致此错误的真正原因。可能来自外部查询的sp_id的值为null或与内部不匹配,或者在某些情况下,子查询中的行太多,对这种情况无效,因为在没有group by的情况下,它不会为了聚合而返回多行,并且只返回一列,前提是总和聚合返回一个
非空值@DaryaWiśniewski虽然第四次似乎有效,但这是一种魅力,对吧,它写得很糟糕,不能作为学习工具。OP是一名学生,给出一个没有解释的工作答案对教学没有什么帮助。不管怎样,你介意试着给我一个关于小组外部参考的答案吗?在我的例子中,没有找到导致此错误的真正原因。可能来自外部查询的sp_id的值为null或与内部不匹配,或者在某些情况下,子查询中的行太多,对这种情况无效,由于它不返回多行以便聚合而不使用group by,并且只返回一列,前提是总和聚合返回非空值@DaryaWiśniewskiI没有考虑这种类型的查询,非常感谢!我没有想到这种类型的查询,非常感谢!