如何使用Type 1嵌套查询查询订单数量大于100的产品?
使用Type 1嵌套查询列出订单数量大于100的产品
没问题,我来帮你一步步实现这个需求!咱们要做的是从PRODUCT表中筛选出总订单数量超过100的产品,正好用你提到的IN子查询(也就是Type 1嵌套查询)来完成。
实现思路拆解
按照你给出的公式SELECT column-names FROM table-name1 WHERE value IN (SELECT column-name FROM table-name2 WHERE condition),我们对应现有表结构拆解:
table-name1就是要取产品信息的PRODUCT表table-name2是存储订单明细的ORDER ITEM表- 核心逻辑是:先通过子查询找出所有总订单量>100的产品ID,再用主查询匹配这些ID对应的产品信息
具体SQL实现
-- 主查询:获取符合条件的产品完整信息 SELECT PROD_ID, PROD_NAME, SUPPLIER_ID, UNITPRICE, PACKAGE, ISDISCONTINUED FROM PRODUCT -- 用IN子查询筛选符合订单量要求的产品ID WHERE PROD_ID IN ( -- 子查询:计算每个产品的总订单量,筛选出超过100的产品ID SELECT PRODUCTID FROM [ORDER ITEM] -- 注意:带空格的表名需按数据库语法调整,比如MySQL用`ORDER ITEM`,Oracle用"ORDER ITEM" GROUP BY PRODUCTID HAVING SUM(QUANTITY) > 100 )
关键部分解释
- 子查询逻辑:先对
ORDER ITEM按PRODUCTID分组,用SUM(QUANTITY)计算每个产品的累计订单数量,再通过HAVING子句(这里不能用WHERE,因为要筛选聚合后的结果)留下总数量大于100的产品ID。 - 主查询逻辑:从
PRODUCT表中选取所有需要的字段,通过PROD_ID和子查询返回的产品ID做匹配,最终得到所有符合订单量要求的产品信息。
小提示
如果你的数据库对带空格的表名有特殊语法要求,记得调整ORDER ITEM的写法:
- SQL Server:用方括号包裹 →
[ORDER ITEM] - MySQL/MariaDB:用反引号包裹 →
`ORDER ITEM` - Oracle:用双引号包裹 →
"ORDER ITEM"
内容的提问来源于stack exchange,提问作者nzar_ar




