You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PieCloudDB数据库中筛选低销量图书的SQL查询问题排查

问题排查:筛选符合条件的图书SQL修正

表结构与数据

Books表(图书信息)

book_idnamelaunch_date
1Pride and Prejudice2010-01-01
2The Kite Runner2012-05-12
3The Da Vinci Code2023-11-10
4Wuthering Heights2022-12-01
5The Moon and Sixpence2018-09-21
6Three Days To See2023-12-20

Orders表(订单信息)

order_idbook_idquantityorder_date
1122020-07-26
2112023-08-05
3382023-11-19
4462023-12-05
5452023-12-10
6592019-02-02
7582020-04-13

需求说明

需筛选满足以下条件的图书:

  • 过去一年(2022-12-20 至 2023-12-20)总订单量少于10
  • 排除发布日期不足一个月的图书(今日为2023-12-20,即launch_date < '2023-11-20')

预期结果

book_idname
1Pride and Prejudice
2The Kite Runner
3The Da Vinci Code
5The Moon and Sixpence

用户原SQL及错误结果

原SQL代码

select book_id,name
from books
where launch_date < '2023-11-20'
and
book_id in (
select book_id
from orders
where order_date between '2022-12-20' and '2023-12-20'
group by book_id
having sum(quantity) < 10);

错误查询结果

book_idname
1Pride and Prejudice
3The Da Vinci Code

问题分析

  1. 遗漏无订单的图书:原SQL的IN子查询仅包含过去一年有订单记录的图书,但像book_id=2、book_id=5这类过去一年没有订单的图书,总订单量为0(满足<10的条件),却被排除在外。
  2. 逻辑覆盖不全:需求中“总订单量少于10”包含订单量为0的情况,原SQL未处理这类场景。

修正后的SQL

SELECT b.book_id, b.name
FROM books b
LEFT JOIN (
    SELECT book_id, SUM(quantity) AS total_quantity
    FROM orders
    WHERE order_date BETWEEN '2022-12-20' AND '2023-12-20'
    GROUP BY book_id
) o ON b.book_id = o.book_id
WHERE b.launch_date < '2023-11-20'
AND COALESCE(o.total_quantity, 0) < 10;

修正逻辑说明

  • 使用LEFT JOIN关联图书表和过去一年的订单统计结果,确保所有符合发布日期条件的图书都被保留。
  • 用COALESCE(o.total_quantity, 0)将无订单图书的总数量转为0,确保这类图书能被纳入“总订单量<10”的筛选范围。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:45:19