0

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

特别是顺序很重要,我无法更改。而且这个语句实际上要复杂得多,有很多连接、子选择和 where 等等,但这里不需要它们......

我的问题是,我需要一个特殊的分页:只需选择从 ID 10 到 ID 15 的 20 个不同 Table1ID 的所有行。(这意味着我想要一个分页,但不是在行数上,而是在此列上唯一值

如果我有一个嵌套选择或一个函数调用,它添加了选择语句的迭代数,我可以使用一个 between,但是我如何计算唯一 ID 并将其添加到那里的查询中?

谢谢你的帮助,卡尔

4

2 回答 2

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

(或者我误解了你的要求,这不太可能)

于 2012-10-18T11:11:42.577 回答
1

实际上它类似于蒂姆施梅尔特所说的,但不是ROW_NUMBER() OVER (PARTITION BY......而是DENSE_RANK() OVER (ORDER BY Table1ID) AS rank

说明: DENSE_RANK 完全符合我的要求。它对表格进行排名,在我的例子中是 Table1ID。效果是,每个 Table1ID 都有自己的 ranknumber。随着rank between 10 and 15我得到我想要的。

坦克你,卡尔

于 2012-10-18T11:47:28.547 回答