34,594
社区成员
发帖
与我相关
我的任务
分享
create table #tb(bz varchar(20),yxj int)
insert into #tb(bz,yxj)
select '大包装',1 union all
select '中包装',2 union all
select '小包装',3
---需求:更改包装的优先级的时候,其他包装所对应的优先级自动转换,也就是优先级不能重复
--如:“大包装”的优先级从“1”变成“2”的时候,原来优先级为“2”的包装的优先级自动转换为“1”
--能不能用一句sql语句实现,不需要使用变量等的方式。
DROP TABLE #tb
-- 多加些测试数据,让修改目标的前、中、后都有数据
create table #tb(bz varchar(20),yxj int)
insert into #tb(bz,yxj)
select 'A',1 union all
select 'B',2 union all
select 'C',3 union all
select 'D',4 union all
select 'E',5
-- 一句语句完成修改
;with a(yxj_old,yxj_new)AS(
SELECT 2,4 -- 修改目标
),
b AS(
-- 自己
SELECT * FROM a
-- 变大,一部分要前移
UNION ALL
SELECT t.yxj AS yxj_old,
t.yxj - 1 AS yxj_new
FROM #tb t
JOIN a
ON t.yxj BETWEEN a.yxj_old + 1 AND a.yxj_new
-- 变小,一部分要后移
UNION ALL
SELECT t.yxj AS yxj_old,
t.yxj + 1 AS yxj_new
FROM #tb t
JOIN a
ON t.yxj BETWEEN a.yxj_new AND a.yxj_old - 1
)
UPDATE #tb
SET #tb.yxj = b.yxj_new
FROM b
WHERE #tb.yxj = b.yxj_old
-- 查看结果
SELECT * FROM #tb ORDER BY yxj
bz yxj
-------------------- -----------
A 1
C 2
D 3
B 4
E 5
bz yxj
-------------------- -----------
A 1
D 2
B 3
C 4
E 5
create table tb(bz nvarchar(20),yxj int)
insert into tb(bz,yxj)
select N'大包装',1 union all
select N'中包装',2 union all
select N'小包装',3
create TRIGGER trg_Update
ON tb
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
declare @old int,@new int,@update_bz nvarchar(20)
select @old=yxj,@update_bz=bz from deleted
select @new=yxj from inserted
update tb set tb.yxj=@old where yxj=@new and bz!=@update_bz
END
GO