仅使用JOIN操作查询从未被借阅图书的SQL问题求助
解决方案
原查询的问题在于:它检查的是是否存在未被借阅的副本,而不是所有副本都从未被借阅。只要某本书有一个副本没被借过,这条关联后的空记录就会被筛选出来,DISTINCT之后就会把整本书纳入结果,这和你的需求不符。
要实现“从未被借阅过的图书”(即该图书的所有副本都没有任何借阅记录),可以通过以下仅用JOIN的方式实现:
SELECT b.bookdescID, b.title, b.subtitle, b.edition, b.place FROM book b LEFT JOIN ( -- 先通过JOIN找出所有有过借阅记录的图书ID SELECT DISTINCT b_inner.bookdescID FROM book b_inner JOIN book_copy bc ON b_inner.bookdescID = bc.bookdescID JOIN borrow_copy brc ON bc.bookID = brc.bookID ) borrowed_books ON b.bookdescID = borrowed_books.bookdescID -- 筛选出不在"有借阅记录"集合里的图书 WHERE borrowed_books.bookdescID IS NULL
逻辑说明
- 内层的JOIN组合:通过
book→book_copy→borrow_copy的关联,找出所有至少有一个副本被借阅过的图书bookdescID,并去重。 - 外层用
LEFT JOIN把主表book和这个“有借阅记录的图书集合”关联,筛选出匹配不上的记录——这些就是没有任何副本被借阅过的图书。
如果你不想用子查询,也可以用多表LEFT JOIN加GROUP BY的方式(核心逻辑仍基于JOIN):
SELECT b.bookdescID, b.title, b.subtitle, b.edition, b.place FROM book b LEFT JOIN book_copy bc ON b.bookdescID = bc.bookdescID LEFT JOIN borrow_copy brc ON bc.bookID = brc.bookID GROUP BY b.bookdescID, b.title, b.subtitle, b.edition, b.place -- 确保该图书的所有副本都没有借阅记录(即关联到的borrow_copy记录数为0) HAVING COUNT(brc.bookID) = 0
这个写法通过GROUP BY按图书分组,统计该图书关联到的借阅记录数量,数量为0就说明没有任何副本被借阅过,同样符合需求。
内容的提问来源于stack exchange,提问作者Vinh Nguyễn
相关产品推荐
相关产品推荐

