2016-11-06 157 views
-1

我有兩個表(書籍,作者)與多對多關係。 我需要SQL語句檢索書籍作者,按作者/書籍排序。重要的是,我必須檢索他們與分頁(抵消...在sql中獲取)。 當我連接表時,結果中有重複(當然)和offset/fetch不能用於此結果的問題之一。結果必須排序的另一個問題(當然不是子頁面,但所有書籍)。SQL語句分頁和排序(連接表)

我有一個想法:(它通過檢索作者姓名排序,分頁包括書籍)

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本書(如果pagesize = 3)及其作者(來自表作者)。所以我應該加入兩張表,但是結果會包含書籍的出版物(因爲書可以有幾個作者),所以如果我使用這個結果分頁(例如OFFSET ... FETCH),我不會得到3本書(I如果這本書有3位作者,我會得到1本書)。 – Ddd

+0

然後,您可能需要使用交叉應用從Books表中檢索所需的行。 –

回答

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