如何仅使用子查询编写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
相关产品推荐
相关产品推荐

