我有两个数据库,一个用于保存账簿记录,另一个用于保存贷款记录。
下面的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;
我做错了什么?
编辑: 我希望查询收集当前可用的书籍,以便生成我想要的报告。可用的书籍包括已退回的书籍和尚未借用的书籍。
答案 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;