SQL JOIN与WHERE子句技术求助:查询从未被购买的书籍信息
解决从未被购买书籍的SQL查询问题
我来帮你搞定这个库存分析的SQL查询需求!首先得理清你的核心目标:找出从未被客户购买过的书籍,同时要展示所有书籍详情和订单号(没被购买的书籍对应的订单号会是NULL),最后按书名排序。
先说说你原来语句的几个问题:
- 普通的
JOIN(也就是内连接)只会保留两个表中匹配的记录,这会过滤掉没有订单的书籍,完全不符合需求 - 缺少关联两个表的
ON子句,数据库不知道怎么把orders和books关联起来 WHERE子句没有筛选条件,无法定位到无购买记录的书籍ORDER BY的位置不对,应该放在查询语句的最后
正确的SQL查询语句(基础场景)
假设你的books表有主键book_id,orders表有外键book_id关联到书籍表(也就是一个订单对应一本书的简单场景),正确的语句应该是:
SELECT o.order_nbr, b.* FROM books b LEFT JOIN orders o ON b.book_id = o.book_id WHERE o.order_nbr IS NULL ORDER BY b.book_title;
语句解释
LEFT JOIN:左连接会保留books表的所有记录,即使在orders表中没有对应的匹配项——这正是我们需要的,要把所有书籍都列出来,再筛选无订单的ON b.book_id = o.book_id:这是两个表的关联条件,告诉数据库用书籍ID来匹配订单和书籍(如果你的外键字段名不同,比如orders里是book_fk,记得改成对应的字段名)WHERE o.order_nbr IS NULL:左连接后,没有被购买的书籍在orders表中没有匹配记录,对应的order_nbr会是NULL,用这个条件就能筛选出从未被购买的书籍ORDER BY b.book_title:最后按书名排序,符合你的需求
补充:多对多关联场景(常见的真实业务场景)
如果你的业务是一个订单可以购买多本书,那orders和books之间应该有一个中间表(比如order_items,包含order_id和book_id),这时候需要调整查询语句,通过中间表关联:
SELECT o.order_nbr, b.* FROM books b LEFT JOIN order_items oi ON b.book_id = oi.book_id LEFT JOIN orders o ON oi.order_id = o.order_id WHERE o.order_nbr IS NULL ORDER BY b.book_title;
这样就能正确关联订单、订单项和书籍,筛选出从未出现在任何订单里的书籍。
内容的提问来源于stack exchange,提问作者Terry Hontz
相关产品推荐
相关产品推荐

