2016-11-06 7 views
-1

私は多対多関係を持つ2つのテーブル(ブックス、著者)を持っています。 著者のの書籍を検索するには、SQL文が必要です。は、著者/書籍によってソートされています。重要なことは、ページ番号(オフセット...フェッチin sql)でを取得する必要があることです。 テーブルの結合時に結果に重複があり(オフセット)、オフセット/フェッチをこの結果に使用できないという問題の1つです。結果を並べ替える必要がある別の問題(サブページではなく、すべての書籍)。ページネーションとSQL文とソート(テーブルを結合する)

私は1つのアイデアがあります(それは著者名でソート図書を取得し、ページネーションを含む)に

select b.id, b.title, a.name from Books b inner join Books_Authors ba 
          on ba.bookID = b.id inner join Authors a 
          on ba.authorID = a.id  
          where a.name in (select name from Authors order by name offset 9 rows fetch next 3 rows only) 
          order by a.name 

をしかし、私は、それは効率的な方法ではないと思います。

+0

使用するMSSSのバージョンに応じて、この方法を指定します。このリンクを見てください:http://stackoverflow.com/a/5620802/100283 –

+0

@マーク・クラム、私の問題は、例えば、3冊の書籍(ページサイズ= 3の場合) )。だから私は2つのテーブルに参加する必要がありますが、その結果には書籍の複数の著者が含まれているため、結果のページングに使用すると(例:OFFSET ... FETCH)私は3冊この本に3人の著者がいる場合は1冊の本を手に入れます)。 – Ddd

+0

次に、クロステーブルを使用して、ブックテーブルから必要な行を取得する必要があります。 –

答えて

0

これは何か?

select * from 
      (
       select tmp1.*, ROW_NUMBER() over(partition by b.title, a.name order by b.id, a.id) rang2 
       from 
       (
       select a.id, b.id, b.title, a.name, ROW_NUMBER() over(partition by b.title, a.name order by b.id, a.id) rang 
       from Books b inner join Books_Authors ba on ba.bookID = b.id 
       inner join Authors a on ba.authorID = a.id 
       ) tmp1 where rang=1 
      ) tmp2 
    where rang2 between 3 and 9 
    order by title, name 
関連する問題