如何编写联合SQL查询高校图书馆可借阅图书的BookCode
可借阅图书查询SQL实现
核心逻辑:可借阅的图书 = 所有馆藏图书 - 存在未归还借阅记录的图书。你已经写好了不可借阅图书的查询逻辑,在此基础上有三种常用实现方案:
方案1:NOT IN 子查询(写法最直观)
直接将你现有不可借阅的查询结果作为排除集合即可:
SELECT DISTINCT "BookCode" FROM "Book" WHERE "BookCode" NOT IN ( SELECT DISTINCT "BookCode" FROM "BorrowBook" WHERE "BorrowDate" IS NOT NULL AND "ReturnDate" IS NULL );
方案2:LEFT JOIN 关联过滤(性能更优,适合数据量较大的场景)
通过左连接关联未归还的借阅记录,没有匹配到关联记录的就是可借阅图书:
SELECT DISTINCT b."BookCode" FROM "Book" b LEFT JOIN "BorrowBook" bb ON b."BookCode" = bb."BookCode" AND bb."BorrowDate" IS NOT NULL AND bb."ReturnDate" IS NULL WHERE bb."ID" IS NULL;
方案3:NOT EXISTS 子查询(逻辑严谨,不会受子查询空值影响)
SELECT DISTINCT "BookCode" FROM "Book" b WHERE NOT EXISTS ( SELECT 1 FROM "BorrowBook" bb WHERE bb."BookCode" = b."BookCode" AND bb."BorrowDate" IS NOT NULL AND bb."ReturnDate" IS NULL );
注意:你提供的测试数据存在字段值不匹配的问题:Book表的BookCode值为Book1/Book2/Book3,但BorrowBook表的BookCode值为B1/B2,实际业务中两个表的关联字段值一致后,上述SQL就能得到你要的B2、B3可借阅的结果。
内容的提问来源于stack exchange,提问作者Nukool
相关产品推荐
相关产品推荐

