我有一个看起来像这样的表:
<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?
答案 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
)。