2016-11-06 56 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