MS Access WHERE NOT IN不工作

时间:2014-11-15 04:05:47

标签: sql notin

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

下面的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;

我做错了什么?

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

2 个答案:

答案 0 :(得分:0)

听起来你需要一个简单的左连接。从你的主人开始" Book"在所有可能的书籍表中,对子查询执行LEFT JOIN。子查询是按书的,计算了多少仍然是超越的(即:未返回)。如果他们被退回,他们可以重新借出。如果仍然没有,它将把它的计数max()设置为1.该组/由只有这些书仍然保持在贷款上。

因此,通过匹配书籍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个实例必须已经返回再次借出。

答案 1 :(得分:0)

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

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;