卡在 SQL 查询上(不同的?)

Posted

技术标签:

【中文标题】卡在 SQL 查询上(不同的?)【英文标题】:Stuck on a SQL Query (Distinct?) 【发布时间】:2012-11-09 19:25:40 【问题描述】:

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

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

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

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

提前感谢您帮助我!

【问题讨论】:

【参考方案1】:

首先,您可能需要注意这本书从未被租过的情况。这需要外部连接。

这应该可以得到你想要的:

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

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

【讨论】:

【参考方案2】:

我认为这归结为以更好的方式构建您的查询。

尝试使用NOT IN &lt;subquery&gt; 而不是加入。这使您的查询更加模块化且更易于理解:

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

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

【讨论】:

这是错误的,这将返回最近一年的所有带有 rendate 的书籍,他想要去年没有出租的列表 不,这种技术有效。我没有 Access,但我用 SQLServer 对其进行了测试,它运行良好。但是,您必须对 Access 进行任何语法修复。想法是子查询在去年获得所有租金。然后我们选择不在该列表中的书籍。这给我们留下了去年没人想租的不受欢迎的书,我知道这就是 OP 所追求的。 为您的查询检查此sqlfiddle.com/#!3/a7a94/2,子查询返回一年之前的所有行而不是去年,他从年份中减去-1,如果子查询正在检查@987654324,您的查询将有效@ 我的错,现在我已经翻转了比较运算符,我认为查询应该差不多了。【参考方案3】:

您似乎错过了&lt;sometablehere&gt; 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());

【讨论】:

以上是关于卡在 SQL 查询上(不同的?)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在不同的线程上或作为不同的进程运行不同的 sql 查询

卡在 SqlDataReader.GetValues 方法上

在多个分组上具有不同功能的 SQL 查询

为啥 SQL 子查询中的外部引用会产生不同的结果?

在 phpmyadmin 和 SQL Fiddle 上执行时相同 SELECT 查询的不同结果

Sql 查询在不同的选项卡中返回不同的结果