在SQL Server中保存并获取任意排序顺序

时间:2009-12-09 10:12:44

标签: sql-server-2008 sorting

我的客户希望通过拖放对产品进行分类。下降。拖曳与使用javascript轻松删除部分。

我的问题是如何保存并获取排序顺序?

我正在使用.net c#和SQL Server 2008.

当我移动产品并将其放在新位置时,我会得到移动产品的ID,产品在前面,产品在后面。有了这些数据,我想更新产品的排序顺序。

我正在考虑添加一个有位置的字段,但我想我必须在位置更改时更新每个项目。

3 个答案:

答案 0 :(得分:1)

一般情况下,添加额外的position字段是您唯一可以做的事情,以获得真正的任意排序。

但您可以通过多种方式实现它。以下是我不久前实现的两种方式。

<强> 1。方法:更新所有position值,方法是循环您的项目并为每个位置执行UPDATE语句。

这很容易实现,但由于许多更新,它对许多项目和/或大型表格都不利。特别是如果您通过Ajax执行此操作并对列表中的每个更改执行完整的重新排序。

<强> 2。方法:仅对受影响的行进行智能更新。

  1. SELECT当前排序顺序中的所有项目(“旧列表”)(通常与UPDATE语句相比较快)
  2. 迭代“新列表”中的所有项目,并将每个项目与旧列表中相同位置/索引处的项目进行比较。如果项目相同,请不要做任何事情
  3. 如果项目不同,请从旧列表中找到该项目,该项目应该实际位于该位置并相应地更新其position值(某些查找数据结构可能在此处有用)
  4. 这样,您只需要执行最少的数据库更新,但是您将拥有更复杂的代码。

    就个人而言,我会采用第一种方式,直到数据库更新实际上成为性能问题。

答案 1 :(得分:0)

我们有一个排序列,但是我们必须re-index所有行都会发生变化。您可以通过以足够大的增量分配排序来缓解这种情况,以便在必须执行此操作之前允许某种程度的可移动性,例如10或100,但这不是最佳解决方案,我有兴趣看看人们有什么其他想法。

答案 2 :(得分:0)

如果您可以以编程方式捕获每个移动(例如使用向上和向下按钮),那么您只需交换移动行和移动行的位置编号。确保在最大位置+ 1处添加新行。