sql查询限制列中的值的数量

时间:2012-10-18 11:06:55

标签: sql sql-server-2005 pagination

我在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

2 个答案:

答案 0 :(得分:2)

您可以将ROW_NUMBERPartition 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 ,我得到了我想要的内容。

坦克你,卡尔