2012-11-09 109 views
0

我正在製作一個圖書館的網頁,我需要製作一份清單,顯示過去一年內沒有出租的所有書籍。Stuck on SQL Query(Distinct?)

目前我有一個查詢過濾租表上的所有記錄都是租用的書籍。但可以多次出租,這樣一本書可以在表格中多次出現。問題在於,一本書一年多沒有租給一個人,但在過去的一年裏,同一本書是租給另一個人的,因爲它看到了一個滿足條件的記錄,所以它仍然顯示該書。但是我需要知道哪些書在過去的一年裏根本沒有出租。任何人都可以幫助我嗎?

我將實際查詢更改爲更容易理解的查詢(語言差異),因此不要檢查拼寫錯誤或簡單的語法問題。

我查詢a.t.m:

SELECT 
    Book.BookID, 
    Book.BoekTitle, 
    Writer.WriterName 
FROM (
    (Book INNER JOIN BookWriter ON Book.BookID=BookWriter.BookID) 
    INNER JOIN Writer ON BookWriter.WriterID=Writer.WriterID 
) 
    INNER JOIN BookRenting ON Book.BookID=BookRenting.BookID 
WHERE 
    BookRenting.RentDate < DATEADD('yyyy', -1, NOW()); 

我使用MS Access數據庫!

在此先感謝幫助我!

回答

0

首先,你可能需要採取的條件照顧那裏的書有從來沒有被租用。這需要外連接。

這應該得到你想要的東西:

select b.BookID, b.BookTitle, w.WriterName 
from book b left outer join 
    (select BookId, max(RentDate) as MaxRentDate 
     from BookRenting br 
     group by BookId 
    ) br 
    on b.BookId = br.BookId left outer join 
    BookWriter bw 
    on b.BookId = bw.BookId left outer join 
    Writer w 
    on bw.WriterId = w.WriterId 
where br.MaxRentDate < DATEADD('yyyy', -1, NOW()); 

而且,我的意思是添加書籍有多個作家。你仍然會得到重複的輸出。

-1

看來你錯過<sometablehere> INNER JOIN Writer ON BookWriter.WriterID=Writer.WriterID

因此,它可能看起來像:

SELECT 
    Book.BookID, 
    Book.BoekTitle, 
    Writer.WriterName 
FROM (
    (Book INNER JOIN BookWriter ON Book.BookID=BookWriter.BookID) 
    **CODETALKSTABLE** INNER JOIN Writer ON BookWriter.WriterID=Writer.WriterID 
) 
    INNER JOIN BookRenting ON Book.BookID=BookRenting.BookID 
WHERE 
    BookRenting.RentDate < DATEADD('yyyy', -1, NOW()); 
0

我認爲這歸結爲以更好的方式構建您的查詢。

嘗試使用NOT IN <subquery>而不是進行連接。這使你的查詢更加模塊化,更容易理解:

SELECT Book.*, Writer.* 
FROM 
Book 
INNER JOIN BookWriter ON Book.BookID=BookWriter.BookID 
INNER JOIN Writer ON BookWriter.WriterID=Writer.WriterID 
WHERE 
Book.BookID NOT IN (
    SELECT BookRenting.BookID 
    FROM BookRenting 
    WHERE BookRenting.RentDate >= DATEADD('yyyy', -1, NOW()) 
); 

我沒有訪問,所以我沒有測試過這雖然

+0

這是錯誤的,這將在去年一年退還所有圖書,他要在去年沒有出租的列表 –

+0

不,這項技術的工作原理。我沒有Access,但我用SQLServer測試過它,它工作正常。雖然您必須爲Access進行任何語法修復。想法是子查詢在去年獲得所有租金。然後,我們挑選不在該列表中的書籍。這給我們留下了去年沒有人想要租用的不受歡迎的書籍,我瞭解的是OP的內容。 – Grubl3r

+0

檢查此http://sqlfiddle.com/#!3/a7a94/2爲您的查詢,子查詢返回所有行在一年前,而不是去年,他從年減去-1,您的查詢將是有效的,如果子查詢是檢查'BookRenting.RentDate> = DATEADD('yyyy',-1,NOW()' –