sql - 仅使用 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 表达式必须包含至少一列不是外部引用”的错误,但无法真正理解。
解决方案
您可以使用相关子查询:
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更直接。
推荐阅读
- python - Numpy 数组到张量
- asp.net-mvc - 我有用于向他们发送邮件的用户列表。我想在另一个列表框中显示选定的用户。我怎样才能做到这一点?
- javascript - 如何以正确的方式使用抽屉反应原生?
- java - 如何使用 selenium java 识别 chrome 中正在进行的下载?
- mysql - 如何在 Node.js 中创建动态数据库连接?
- c++ - 无法在 Linux 上运行 C++ ZMQ 项目的可执行文件
- apache-spark - 具有大量读写和与 Spark Structured Streaming 集成性能的数据存储
- python - 用于输入值和获取方程式的标识符中的无效字符
- hive - Presto 失败:com.facebook.presto.spi.type.VarcharType
- linux - 商店 ls | 排序-n | head -1 < this 进入变量 shell 脚本