背景:从一堆用户中取出部分符合要求用户的ID转化为字符串并排形式,假设共取1000个。
方案一:新建临时表,在对临时表数据进行操作。总共有4中情况,需要创建四次临时表,多次判断
1 DECLARE @UserCount1 INT --VIP等级大于28的用户数 2 SELECT T.UserID INTO #TempTableOf28 3 FROM GAMECENTERLINKEDSERVER.GameCenter.LevelSystem.VIP_UserGrade VG ,#TempTable T 4 WHERE VG.UserID = t.UserID AND VG.Grade>=28 ORDER BY VG.Grade DESC --倒叙,高VIP等级优先获奖 5 SELECT @UserCount1=COUNT(UserID) FROM #TempTableOf28
1 DECLARE @StringUserID1 VARCHAR (max) 2 SET @StringUserID1=‘‘ 3 IF EXISTS(SELECT 1 FROM #TempTableOf28 ) AND @UserCount1<=1000 --VIP等级大于28,要么不足1000,要么直接取完,取完改@DrawCount=0,不再执行其他部分 4 SELECT @StringUserID1=@StringUserID1+‘,‘+CAST(UserID AS VARCHAR) FROM #TempTableOf28 5 ELSE IF EXISTS(SELECT 1 FROM #TempTableOf28 ) AND @UserCount1>1000 6 SELECT TOP 1000 @StringUserID1=@StringUserID1+‘,‘+CAST(UserID AS VARCHAR) FROM #TempTableOf28
小结:有四种情况需要创建四个临时表,判断结构中直接把相应的部分转换为字符串结构。
方案二:不使用临时表,优化判断结构
1 IF (SELECT COUNT(1) FROM @vip)<=1000 2 INSERT INTO @UsersLast 3 SELECT UserID FROM @vip 4 ELSE IF (SELECT COUNT(1) FROM @vip WHERE Vip>=28)>=1000 5 INSERT INTO @UsersLast 6 SELECT TOP 1000 UserID FROM @vip WHERE vip>=28 15 ELSE 16 INSERT INTO @UsersLast 17 SELECT TOP 1000 UserID FROM @vip 18 ORDER BY vip DESC
小结:直接写入表,判断结构清晰,最后再将相关表直接转换为符合要求的类型。
总结:两种方式均可完成需求,但第一种不仅仅大量使用临时表,而且产生大量重复代码,代码整合度也很低。从接口整体情况来看,第一种方案的代码是第二种的三倍之多。效率相比可见一斑。so,优化之路路漫漫其修远兮~
原文地址:https://www.cnblogs.com/zhangrenzhi/p/8797038.html
时间: 2024-10-15 03:02:50