根据排序重置列值

时间:2019-10-31 16:35:34

标签: sql sql-server tsql

我有一个看起来像这样的表:

<pre>

我正在向该表添加以下行:

+-----+------------+-----------+--------------------+
| ID  | EntityName | SortOrder | EntityCollectionId |
+-----+------------+-----------+--------------------+
| 123 | Apples     |         1 |                114 |
| 124 | Beer       |         2 |                114 |
| 125 | Chicken    |         3 |                114 |
| 126 | Tom        |         1 |                115 |
| 127 | Dick       |         2 |                115 |
| 128 | Harry      |         3 |                115 |
+-----+------------+-----------+--------------------+

鉴于我现在想对EntityCollection 114的所有项目重新执行SortOrder,以使它们按EntityName的字母顺序排列,我该怎么做而又不触及其他集合的SortOrder?

1 个答案:

答案 0 :(得分:2)

您可以使用可更新的cte:

with cte as (
    select 
        sortOrder, 
        row_number() over(partition by EntityCollectionId order by EntityName) rn
    from mytable 
    where EntityCollection = 114
)
update cte set SortOrder = n

请注意,where子句不一定是必需的。如果只有实体集合114具有更改,则其他记录的排序顺序将重新分配为相同的值。

最后:将这种类型的信息存储在表中几乎没有意义。每当进行数据修改操作时,您都需要扫描表以重新分配排序顺序。似乎仅在需要时动态计算信息会更简单(通常在row_number()查询中使用select)。