首页 文章

坚持SQL查询(区别?)

提问于
浏览
0

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

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

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

我的查询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数据库!

在此先感谢您的帮助!

3 回答

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

    并且,我想补充一点,书籍可以有多个作家 . 您仍将在输出中获得重复项 .

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

    我没有Access,所以我没有测试过这个

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

相关问题