【问题标题】:Custom Sort (not using ORDER BY) and pagination自定义排序(不使用 ORDER BY)和分页
【发布时间】:2013-05-10 04:01:13
【问题描述】:

我有一个搜索类型网页的中等复杂查询(到目前为止超过 1K LOC)。结果集需要按特定顺序排列。有 7 种不同的标准可用于订购此套装。我有两个 TABLE 变量,一个名为 @stageTable 和 @resultTable。我使用搜索参数运行动态查询并将结果放入@stageTable。然后,我为 7 个订单标准中的每一个处理 @stageTable,并将每个块放入 @resultTable。这按预期工作。

我被要求为这个怪物查询添加分页。我用 ROW_NUMBER() 路线去了 CTE。但是,我意识到这不尊重@resultTable 中的顺序。我遇到的问题是 ROW_NUMBER() OVER 子句使用了 ORDER BY,它不允许我保持我在@resultTable 中精心设计的顺序。我尝试了不同的方法,包括在 CTE 中添加 CASE 块。

此问题仅适用于用户第一次加载页面,以及在不使用搜索页面的任何条件的情况下滚动时。

关于如何处理这个问题的任何想法?

【问题讨论】:

  • 选择默认排序。

标签: sql tsql pagination dynamic-sql


【解决方案1】:

在定义@ResultTable 时,添加一个标识列:

declare @ResultTable table (
     ResultTableId int not null identity(1, 1),
     . . .
);

插入表格时,将所有其他列放入列列表中:

insert into @ResultTable (col1, . .. )
    select . . .

标识列将根据​​输入的顺序进行设置。当使用带有插入的order by 时,SQL Server 保证输入的顺序(或至少它们的 id)(请参阅here -- 感谢 Mikael Eriksson 提供此参考)。

当您输入最终的order by 时,您可以在订购时添加ResultTableId

row_number() over (order by col1, ResultTableid)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2022-01-03
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多