2014-11-15 61 views
0

我有兩個數據庫,一個用於存放賬簿記錄和一個用於存放貸款記錄。MS Access不在工作

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

您在BookID列上有一個內部聯接,但是您只是要求在一張表中返回空值的書籍? – Ilion

回答

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; 
+1

謝謝!我希望我能'投票'你,但林相對較新的stackoverflow,不能直到我得到15代表。 –

0

這聽起來像你需要一個簡單的左連接。從所有可能書籍的主「書籍」表開始,對子查詢執行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個實例必須已經被重新借出。