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

如何仅使用子查询编写Oracle SQL查询:筛选SQL/DB双分类已订购书籍

解决方案:用子查询实现需求

没问题,我来帮你搞定这个SQL查询需求!根据你给出的表结构和要求,我们可以通过多层子查询精准筛选出符合条件的图书,具体实现如下:

方法一:使用IN子查询

这种写法直观易懂,适合快速理解逻辑:

SELECT book_id, title
FROM bk_books
-- 条件1:筛选所有被订购过的图书
WHERE book_id IN (SELECT book_id FROM bk_order_details)
  -- 条件2:筛选属于DB分类的图书(替换成实际的DB对应的topic_id)
  AND book_id IN (SELECT book_id FROM bk_book_topics WHERE topic_id = 2)
  -- 条件3:筛选属于SQL分类的图书(替换成实际的SQL对应的topic_id)
  AND book_id IN (SELECT book_id FROM bk_book_topics WHERE topic_id = 5)
-- 按book_id升序排序
ORDER BY book_id;

方法二:使用EXISTS子查询

如果你的数据量较大,EXISTS子查询的效率会更高(它找到匹配项就停止检索,不需要返回全部结果):

SELECT b.book_id, b.title
FROM bk_books b
-- 验证该图书存在于订单明细中(被订购过)
WHERE EXISTS (SELECT 1 FROM bk_order_details od WHERE od.book_id = b.book_id)
  -- 验证该图书属于DB分类
  AND EXISTS (SELECT 1 FROM bk_book_topics bt WHERE bt.book_id = b.book_id AND bt.topic_id = 2)
  -- 验证该图书属于SQL分类
  AND EXISTS (SELECT 1 FROM bk_book_topics bt WHERE bt.book_id = b.book_id AND bt.topic_id = 5)
ORDER BY b.book_id;

关键说明:

  • 请把代码中的2和5替换成你实际业务中对应DB和SQL的topic_id数值;
  • 两个方法都严格遵循了“仅使用子查询”的要求,没有用到JOIN;
  • 最终结果会按book_id升序排列,完全符合你的排序要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:22