是否生成用于更改项目顺序的更新SQL?

是否生成用于更改项目顺序的更新SQL?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,假设我有这张桌子 ID Name Order ======== ======== ========= 1 d 1 2 g 2 3 b 3 4 f 4 5 a 5 现在,在我的UI中,用户可以通过拖放更改顺序。例如,他可以将项目d移动到某个位置。那我的桌子看起来像

假设我有这张桌子

 ID         Name       Order
======== ========  =========
 1           d          1
 2           g          2
 3           b          3
 4           f          4
 5           a          5
现在,在我的UI中,用户可以通过拖放更改顺序。例如,他可以将项目d移动到某个位置。那我的桌子看起来像

 ID         Name       Order
======== ========  =========
 2           g          1
 3           b          2
 4           f          3
 1           d          4
 5           a          5

有人能告诉我SQL吗?我输入了ID、OldOrder和NewOrder。

您甚至不需要
ID
参数

UPDATE
  yourTable
SET
  Order = (CASE WHEN     Order = @oldOrder THEN @newOrder
                WHEN @newOrder > @oldOrder THEN Order - 1
                                           ELSE Order + 1 END)
WHERE
     Order BETWEEN @oldOrder AND @newOrder
  OR Order BETWEEN @newOrder AND @oldOrder
  • 任何高于或低于原始和新位置的内容都不需要更改
  • 其他所有东西都向上或向下移动一个
  • 除原始项目外,该项目将移动到新位置

    • 您甚至不需要
      ID
      参数

      UPDATE
        yourTable
      SET
        Order = (CASE WHEN     Order = @oldOrder THEN @newOrder
                      WHEN @newOrder > @oldOrder THEN Order - 1
                                                 ELSE Order + 1 END)
      WHERE
           Order BETWEEN @oldOrder AND @newOrder
        OR Order BETWEEN @newOrder AND @oldOrder
      
      • 任何高于或低于原始和新位置的内容都不需要更改
      • 其他所有东西都向上或向下移动一个
      • 除原始项目外,该项目将移动到新位置

      我假设ID是您唯一的标识符。您需要跟踪订单的历史记录(使用OldOrder)还是只关注用户要更新到的当前订单?@RayK,一次更新多行。我假设ID是您的唯一标识符。您需要跟踪订单历史记录(使用OldOrder)还是只关心用户要更新到的当前订单?@RayK,一次更新多行。我必须承认,您的答案比我(同时)删除的答案要好得多+谢谢你教我这么好solution@user960567我不认为这是大的,因为它更新所有必要的记录,处理向上和向下移动,并在一个单一的声明。考虑到你所要求的一切,你希望这个有多短?(我不认为任何SQL查询是大的,直到它达到至少20行)…<代码>更新您的表< /代码>不能改变。代码>设置顺序=无法更改。三角箱的3个部件
      将项目移动到新位置
      如果项目向上移动,则向下移动其他项目
      如果项目向下移动,则向上移动其他项目
      。还有一个
      WHERE
      子句,确保您只更新实际需要更新的行。这是一个很好的解决方案,在Android上也适用于SQL Lite。我必须承认,您的答案比我(同时)删除的答案要好得多+谢谢你教我这么好solution@user960567我不认为这是大的,因为它更新所有必要的记录,处理向上和向下移动,并在一个单一的声明。考虑到你所要求的一切,你希望这个有多短?(我不认为任何SQL查询是大的,直到它达到至少20行)…<代码>更新您的表< /代码>不能改变。代码>设置顺序=无法更改。三角箱的3个部件
      将项目移动到新位置
      如果项目向上移动,则向下移动其他项目
      如果项目向下移动,则向上移动其他项目
      。还有一个
      WHERE
      子句,确保只更新实际需要更新的行。这是一个很好的解决方案,在Android上也可以使用SQLLite。