0

我正在为图书馆制作一个网页,我需要制作一个列表,显示过去一年内未出租的所有书籍。

目前我有一个查询 Rent 表,其中所有记录都是租借的书籍。但可以多次租用,因此一本书可以多次出现在桌子上。问题是,当一本书没有租给一个人超过一年,但同一本书在过去一年内租给另一个人时,它仍然显示那本书,因为它看到了一个满足条件的记录。但是我需要知道在过去的一年里哪本书根本没有被租过。任何人都可以帮助我吗?

我将真正的查询更改为更易于理解的查询(语言差异),因此不要检查拼写错误或简单的语法问题。

我的查询自动取款机:

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 数据库!

提前感谢您帮助我!

4

3 回答 3

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())
); 

我没有访问权限,所以我还没有测试过这个

于 2012-11-09T19:34:46.587 回答
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());

而且,我的意思是补充说书籍可以有多个作家。您仍然会在输出中得到重复项。

于 2012-11-09T19:35:14.763 回答
-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());
于 2012-11-09T19:31:11.040 回答