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

仅使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:31:14