0

図書館のウェブページを作成していて、過去 1 年以内にレンタルされていないすべての本を表示するリストを作成する必要があります。

現時点では、すべてのレコードがレンタルされた本である Rent テーブルをフィルター処理するクエリがあります。ただし、複数回レンタルできるため、本がテーブルに複数回表示される可能性があります。問題は、ある本が 1 年以上貸し出されていないが、同じ本が過去 1 年以内に別の人に貸し出された場合、1 つのレコードが条件を満たしているため、その本がまだ表示されることです。しかし、過去 1 年間にまったくレンタルされていない本を知る必要があります。誰でもそれで私を助けることができますか?

実際のクエリをよりわかりやすいクエリに変更した (言語の違い) ため、スペルミスや単純な構文の問題はチェックしないでください。

私のクエリatm:

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 に答える