0

我已经为这个问题设计了一个答案(我将在最后发布),但我只是想知道是否有一种“更简洁”的方式来构建查询。

问题如下:

菲利普·罗斯最新一本书的书名和出版年份是什么?您不能使用 ORDER BY 子句。编写一条 SQL 语句。使用子查询。不要假设您已经知道 Philip Roth 的 AuthorId、他最新一本书的 BookId 或最新一本书的发行年份。

数据库中的相关表:

Books (BookId, Title, YearPublished)
Authors (AuthorId, FirstName, LastName)
WrittenBy  (AuthorId, BookId)

我的解决方案:

SELECT Title, YearPublished
FROM Books NATURAL JOIN Authors NATURAL JOIN WrittenBy
WHERE YearPublished = (SELECT MAX(YearPublished)
                       FROM Books NATURAL JOIN Authors NATURAL JOIN WrittenBy
                       WHERE AuthorId = (SELECT AuthorId
                                         FROM Authors
                                         WHERE FirstName = 'Philip'
                                         AND LastName = 'Roth'))
AND FirstName = 'Philip'
AND LastName = 'Roth';

我想不出一种不再指定名字和姓氏的方法。否则,它只会列出与菲利普罗斯最新出版物同一年出版的所有书籍。

此查询完美运行。但是,有没有更简洁的方法来查询这个?

谢谢 :)

(至于我使用的是哪个 DBMS:这些是一些考试复习练习。我们必须使用由大学创建和提供的一个。它是非常基本的 SQL。比 Access 2010 更简单)

4

2 回答 2

0

你可以这样写

SELECT Title, YearPublished
FROM Books NATURAL JOIN Authors NATURAL JOIN WrittenBy
WHERE YearPublished = (SELECT MAX(YearPublished)
                       FROM Books b NATURAL JOIN Authors a NATURAL JOIN WrittenBy wby
                       WHERE a.FirstName='Philip' and a.LastName='Roth')
AND FirstName = 'Philip'
AND LastName = 'Roth';

此解决方案删除一个子查询。

于 2013-09-10T03:01:13.907 回答
0

您可以使用NOT EXISTS反半连接更简单:

SELECT b.Title, b.YearPublished
FROM   Authors         AS a
NATURAL JOIN WrittenBy AS w
NATURAL JOIN Books     AS b
WHERE  a.FirstName = 'Philip'
AND    a.LastName = 'Roth'
NOT EXISTS (
   SELECT 1
   FROM   Books           AS b1
   NATURAL JOIN WrittenBy AS w1
   WHERE  w1.AuthorId = a.AuthorId
   AND    b1.YearPublished > b.YearPublished
   );

这个问题意味着每年只有一本书和作者 - 或者它会模棱两可(你会得到多行)。

于 2013-09-10T02:59:13.417 回答