0

我有两个数据库,一个用于保存账簿记录,一个用于保存贷款记录。

只有下面的 SQL 不能正常工作。它为我提供了书籍已归还的结果,但不包括未作为贷款一部分的书籍。

SELECT Book.BookID, Book.ISBN, Book.Title, Book.AuthorID, Book.SubjectID, Loans.[Returned?]
FROM Book INNER JOIN Loans ON Book.BookID = Loans.BookID
WHERE ((Book.BookID) Not In (SELECT DISTINCT BookID FROM [Loans] WHERE BookID IS NOT NULL)) OR (((Loans.[Returned?])=True))
ORDER BY Book.Title;

我做错了什么?

编辑:我希望查询收集当前可用的书籍,以生成我想要生成的报告。可用书籍包括已归还的书籍和尚未借阅的书籍。

4

2 回答 2

0

听起来您需要一个简单的左连接。从所有可能书籍的主“书籍”表开始,对子查询执行 LEFT JOIN。子查询是按书计算的,计算有多少仍然出色(即:未返回)。如果它们被归还,它们可以重新借出。如果仍然在外面,它将把它的计数 max() 设置为 1。 group by / having 只会让那些书仍然在外借。

因此,通过匹配图书 ID 进行左连接,您将只能通过 StillLoanedOut.BookID IS NULL 从主图书列表中获取在 StillLoanedOut 子查询中没有剩余记录的图书。

SELECT 
      B.BookID, 
      B.ISBN, 
      B.Title, 
      B.AuthorID, 
      B.SubjectID
   FROM 
      Book B
         LEFT JOIN 
         ( select L.BookID
             from Loans L
             group by L.BookID
             having MAX( case when L.Returned then 0 else 1 end ) = 1 ) as StillLoanedOut
         ON B.BookID = StillLoanedOut.BookID
   WHERE 
      StillLoanedOut.BookID IS NULL
   ORDER BY 
      B.Title;

由于我不知道您的贷款表的结构如何,因此这种方法应该适用于有多个记录显示任何特定书籍的贷款历史的情况。通过执行 max(),如果一本书被借出 8 次,最多只有 1 个(最近的)时间没有被归还……之前的 7 个实例必须已经归还才能再次被借出。

于 2014-11-15T04:56:21.837 回答
0

如果我理解正确,您希望所有不在 Loans 表中的书籍和 Loans 表中的书籍都标记为已退回。尝试这个:

SELECT 
  Book.BookID, 
  Book.ISBN,
  Book.Title, 
  Book.AuthorID, 
  Book.SubjectID, 
  Loans.[Returned?]
FROM Book 
LEFT JOIN Loans ON Book.BookID = Loans.BookID
WHERE 
  (((Loans.BookID) is NULL)) 
OR 
  (((Loans.[Returned?])=True))
ORDER BY Book.Title;
于 2014-11-15T04:56:58.427 回答