--------------求一SQL语句--------------------

-Tracy-McGrady- 2016-12-15 01:37:27

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语句实现,不需要使用变量等的方式。


...全文
150 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2016-12-16
  • 打赏
  • 举报
回复
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

修改目标 2,4 的结果
bz                           yxj
-------------------- -----------
A 1
C 2
D 3
B 4
E 5

修改目标 4,2 的结果
bz                           yxj
-------------------- -----------
A 1
D 2
B 3
C 4
E 5
道素 2016-12-16
  • 打赏
  • 举报
回复
下面是触发器方法,仅供参考,:

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
xiaoxiangqing 2016-12-16
  • 打赏
  • 举报
回复
那就要同时判断,我觉得改后重新排序还简单些
卖水果的net 版主 2016-12-16
  • 打赏
  • 举报
回复
要用触发器实现 ?
-Tracy-McGrady- 2016-12-16
  • 打赏
  • 举报
回复
shoppo0505 2016-12-15
  • 打赏
  • 举报
回复
引用 2 楼 yangsh0722 的回复:
[quote=引用 1 楼 shoppo0505 的回复:] 可以使用一句语句完成,但是语句会比较长,而且更改的结果会有随机性。
写来看看,大神[/quote]
引用 2 楼 yangsh0722 的回复:
[quote=引用 1 楼 shoppo0505 的回复:] 可以使用一句语句完成,但是语句会比较长,而且更改的结果会有随机性。
写来看看,大神[/quote] 想了一下,还是不行。 从优先级为“2”的包装的优先级自动转换为“1”的时候,还是需要变量来传递信息的。
-Tracy-McGrady- 2016-12-15
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
可以使用一句语句完成,但是语句会比较长,而且更改的结果会有随机性。
写来看看,大神
shoppo0505 2016-12-15
  • 打赏
  • 举报
回复
可以使用一句语句完成,但是语句会比较长,而且更改的结果会有随机性。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧