我在SQL Server 2005上工作,我有两个表,如下所示:
表1
ID (Guid) Primarykey
something1 (string)
something2 (string)
和
表2
ID (Guid) Primarykey
Table1ID (Guid) is a ForeignKey to Table1
OrderNr (int)
something1 (string)
something2 (string)
现在我必须做一个选择查询(给我数百个结果),基本上是这样的:SELECT * from Table2 where something1 = 'foo' order by Table1ID, OrderNr
特别是订单的重要性,我无法改变。而且声明实际上要复杂得多,有很多连接,子选择和滚动等等,但这里不需要它们......
我的问题是,我需要一个特殊的分页:只需选择具有20个不同的Table1ID的所有行,从ID 10开始到ID 15.(这意味着我想要一个分页,但不是在rowcount上,而是在这个列唯一值)
如果我有一个嵌套的select或一个函数调用,它添加了select语句的迭代次数,我可以使用一个,但是我如何计算唯一ID并将其添加到那里的查询中?
感谢您的帮助,Karl
答案 0 :(得分:2)
您可以将ROW_NUMBER
与Partition By
:
WITH CTE AS
(
SELCT Columns, ...
, RN = ROW_NUMBER() OVER (PARTITION BY Table1IDs ORDER BY ID)
FROM dbo.Table
)
SELECT Columns, ...
FROM CTE
WHERE RN BETWEEN 10 AND 15
(或者我误解了你的要求,这并非不太可能)
答案 1 :(得分:1)
实际上它类似于Tim Schmelter所说的,但不是 ROW_NUMBER() OVER (PARTITION BY
...而是 DENSE_RANK() OVER (ORDER BY Table1ID) AS rank
说明:DENSE_RANK完全符合我的要求。它按表格ID排列表格,在我的例子中。效果是,每个Table1ID都有自己的排名编号。通过 rank between 10 and 15
,我得到了我想要的内容。
坦克你,卡尔