hor*_*ace 4 sql-server row-number
我有一个需要在列表中显示数据“页面”的应用程序。基本想法是相当普遍的。显示屏显示项目列表,显示屏底部是一些控件,可让您转到数据的下一个“页面”。
一切都很好。我有这个工作。
以下是我用来支持“下一个”行为的视图中的SQL。
CREATE VIEW CampaignParticipants AS
SELECT row_number() OVER (ORDER BY TPT.LastName, TPT.FirstName, TPT.DoB) AS RowNumber
,CGP.*
,TPT.*
FROM tblCampaignGEDPush CGP
JOIN tblParticipants TPT
ON CGP.PartID = TPT.PartID
Run Code Online (Sandbox Code Playgroud)
这是我使用VIEW的方式
SELECT *
FROM CampaignParticipants
WHERE RowNumber >= 0
AND RowNumber <= 100
Run Code Online (Sandbox Code Playgroud)
这模拟了从VIEW抓取100个结果的“第一页”。通过每组结果的页面只是桃色。
很棒。但是:
正如一些处理过此问题的人可能知道的那样,这是有缺陷的。如果我想继续搜索TPT.LastName like 'R%'并获得第一组结果,那我就注定了。
我将要开始查看,在处RowNumber = 0停止RowNumber = 100,但“ R”结果可能会超出该范围。结果:列表返回为空。
而且它变得更加棘手:用户希望能够“过滤” LastName,FirstName,DoB,Location,Phone,Zip等任何内容。
**编辑:我真的不能将过滤器放在“内部”查询中,因为它在视图中,并且过滤器可以任意更改
任何人有任何想法如何得到这个结果集有一个row_number()对过滤的结果集?
这样的事情应该做...
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY LastName, FirstName, DoB) AS __RN
FROM CampaignParticipants
WHERE LastName LIKE 'R%') innerData WHERE __RN BETWEEN 1 and 100
Run Code Online (Sandbox Code Playgroud)
但是,您应该使用列名,而不是'*'。我不知道您的桌子是什么样子,所以我无法为您填写。
| 归档时间: |
|
| 查看次数: |
1691 次 |
| 最近记录: |