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';

姓と名を再度指定しない方法がわかりません。それ以外の場合は、Philip Roth の最新の出版物と同じ年に出版されたすべての本をリストするだけです。

このクエリは完全に機能します。しかし、これを照会するよりクリーンな方法はありますか?

ありがとう :)

(私が使用している DBMS について: これらは試験の復習演習です。大学が作成および提供したものを使用する必要があります。これは非常に基本的な SQL です。Access 2010 よりも簡単です)

4

2 に答える 2

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

この質問は、1 年に 1 冊の本と著者しかないことを意味します。そうでない場合、あいまいになります (複数の行が得られます)。

于 2013-09-10T02:59:13.417 に答える
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';

このソリューションは、1 つのサブクエリを削除します。

于 2013-09-10T03:01:13.907 に答える