首页 > 解决方案 > 仅使用 SELECT 的 SQL 子查询

问题描述

我只需要使用 SELECT 和聚合函数编写带有子查询的查询,例如:

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()。我拥有的数据:表 SPERSON:

sp_id | sp_name
---------------
 10   | Jones
 39   | Matsu
 23   | Atsuma

表销售:

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

等等

任务是返回产品总数 <= 75 的 sp_name 。

老师说我们不允许使用 join,但我怀疑是否有任何方法不使用它。这是我到目前为止所拥有的:

select sp_name
from SPERSON
where sp_id in (select sp_id from SALE
    where qty in (select sum(qty) group by sp_id));

无论如何,我只得到了“每个 GROUP BY 表达式必须包含至少一列不是外部引用”的错误,但无法真正理解。

标签: sqlsql-server

解决方案


您可以使用相关子查询:

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更直接。


推荐阅读