我有这个应用程序,当您在列表中拖放行时,它会按首选项编号重新排序和设置该行,例如 1-5,1 是最优先的。因此,如果我在列表中有 5 条记录,我可以拖动每一行,并在拖放时根据偏好重新排序列表。我可以将第 5 行移至第 1 行,或将第 2 行移至第 3 行,等等…这将根据您放置的位置更新 SQL 表中的首选项编号。
这个应用程序是实时的。当新行自动添加到表中时,它们的初始首选项为“0”。此查询会将下一个数字首选项添加到记录中,因此,如果我有首选项为 1-5 的行,则会出现一条新记录,然后为其分配首选项 6:
with CTE as ( select Id, Preference, cp.maxpref, row_number() over(order by Id) rn from [RadioQDB].[dbo].[Rad5] cross apply ( select max(preference) maxpref from [RadioQDB].[dbo].[Rad5] p ) cp where preference = 0 ) update cte set preference = maxpref + rn where preference = 0
我现在遇到的问题是,如果在更新期间从列表中删除了一条记录(不是用户拖放),假设您在列表中有 1、2、3、4、5 条记录。如果在表更新期间,一条记录被自动删除,假设 #2,那么您最终会得到首选项 1、3、4、5。如何将所有内容向上移动并根据偏好重新排序表格?1 保持不变,3 移动到 2,4 移动到 3,依此类推。
谢谢你。
Preference=Max(Preference)+1要使用以下查询插入新记录:
Preference=Max(Preference)+1
insert into Rad5 values(10,(select max(Preference)+1 from Rad5)); -- inserts a new record with id=10
要根据Preference删除记录后的记录重新排序,请尝试以下操作:
Preference
with cte as ( select id, Preference, row_number() over (order by Preference) as rn from Rad5) update cte set Preference=rn;
您可以使用Triggeron delete from your table 在删除记录时自动调用更新查询,如果您想这样做,请使用以下命令:
Trigger
create trigger Rad5_Delete on Rad5 for delete as with cte as ( select id, Preference, row_number() over (order by Preference) as rn from Rad5) update cte set Preference=rn;
查看db<>fiddle的演示。