小编典典

按首选项更新表并相应地重新排序表

sql

我有这个应用程序,当您在列表中拖放行时,它会按首选项编号重新排序和设置该行,例如 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,依此类推。

谢谢你。


阅读 180

收藏
2022-07-22

共1个答案

小编典典

Preference=Max(Preference)+1要使用以下查询插入新记录:

insert into Rad5 values(10,(select max(Preference)+1 from Rad5));
-- inserts a new record with id=10

要根据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 在删除记录时自动调用更新查询,如果您想这样做,请使用以下命令:

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的演示。

2022-07-22