2017-06-12 3 views
1

私は、次の列では、次のpsqlのテーブルを持っている:最大値を含むPSQLクエリを構築する方法は?

Library: 
    library_id 

Shelf: 
    shelf_id 
    library_id (Library foreign key) 
    forbidden = (boolean) 

Author 
    author_id 
    shelf_id (Shelf foreign key) 
    number_pages_witten 

Book 
    book_id 
    author_id (Author foreign key) 
    book_name 

私は戻って、次を取得するクエリが必要になります。

library_id = 5の場合は、書かれている著者から書籍名のリストを取得「禁止」= Falseの

を持つすべてのシェルフの棚あたりほとんどのページ、私がこれまでに次き:

SELECT name FROM Book AS b 
INNER JOIN Author AS a 
ON b.author_id = a.author_id 
... 
... 
WHERE library_id=5 

私のSQL構文は非常に弱いです。私は、シェルフのページの最も多くのページを持つ著者を取得し、残りのクエリに接続するのに問題があります。ありがとうございました。

答えて

0

「偽= 『禁断の』持っているすべてのシェルフの棚ごとのほとんどのページを書いた著者の、」取得するための要件は、rank()ウィンドウ関数のための古典的なユースケースです。そこから内側のクエリが必要です:

SELECT name 
FROM book b 
WHERE b.author_id IN (SELECT author_id 
         FROM (SELECT a.author_id, 
           RANK() OVER 
             (PARTITION BY a.shelf_id 
             ORDER BY number_pages_written DESC) rk 
           FROM author a 
           JOIN shelf s ON a.shelf_id = a.shelf_id 
           WHERE library_id = 5) 
         WHERE rk = 1) 
関連する問題