VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 982|回复: 10

临时表使用的问题改错,谢谢大家,在线等

[复制链接]

1

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-7 17:30:02 | 显示全部楼层 |阅读模式
if object_id('tempdb..#tmp') is not null     
drop table #tmp GO
----创建测试数据
declare @t table(S_DATA int,S_TIME int,S_ID int)
insert @t
select 3,        12,      null union all select 2,        13,      null union all select 2,        14,      null union all select 1,        15,      null union all select 4,        16,      null union all select 5,        17,      null union all select 3,        18,      null union all select 3,        19,      null union all select 2,        20,      null union all select 4,        21,      null union all select 1,        22,      null union all select 2,        23,      null union all select 3,        24,      null union all select 5,        25,      null union all select 3,        26,      null union all select 2,        27,      null union all select 6,        28,      null union all select 2,        29,      null union all select 3,        30,      null union all select 4,        31,      null union all select 1,        32,      null union all select 1,        33,      null union all select 2,        34,      null union all select 5,        35,      null union all select 2,        36,      null union all select 3,        37,      null union all select 4,        38,      null union all select 1,        39,      null union all select 2,        40,      null union all select 3,        41,      null   
----从上至下更新
declare @data int,@flag int set @flag = 1  
UPDATE @t SET
/*使用@data作为判断S_DATA连续为4,5,6无效数据的标志*/
@data = case
when @data between 4 and 6 and S_DATA between 4 and 6 then 888 else S_DATA
end,
@flag =  
case  
when S_DATA between 1 and 3 then @flag
when S_DATA between 4 and 6 and @data <> 888 then @flag + 1
else 1
end,
S_ID =  
case  
when S_DATA between 4 and 6  then null  
else @flag  end  
----生成用于从下至上更新的临时表
select * into #tmp from @t order by S_TIME DESC  
----从上至下更新临时表(相当于从下至上更新原表)
declare @mark bit     
/*更新S_ID时使用的判断标志*/
set @flag = 1  
UPDATE #tmp SET
@mark =  
case  
when @mark = 1 then 1  
else  
case when S_DATA = 6 then 1 end
/*如果遇到S_DATA = 6的行,则之后的行禁止被更新*/
end,
/*使用@data作为判断S_DATA连续为4,5,6无效数据的标志*/
@data =
case
when @data between 4 and 6 and S_DATA between 4 and 6 then 888 else S_DATA
end,
@flag =  
case  
when S_DATA between 1 and 3 then @flag
when S_DATA between 4 and 6 and @data <> 888 then @flag + 1
when S_DATA between 4 and 6 and @data = 888 then @flag else 1
end,
S_ID =
case
when @mark = 1 then S_ID    /*第一次更新时S_DATA = 6之前的行的S_ID不再更新,保持原值*/ else  
case  
when S_DATA between 4 and 6 then null  
else @flag  
end  
end  
----更新原表的S_ID
update a set S_ID = b.S_ID from @t as a  
inner join #tmp as b on a.S_DATA = b.S_DATA and a.S_TIME = b.S_TIME  
----查看更新
select * from @t  
----清除测试环境
drop table #tmp
回复

使用道具 举报

1

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-26 05:45:01 | 显示全部楼层
但是我用这组数据测试就错了:
select 3,        12,      null union all
select 2,        13,      null union all
select 2,        14,      null union all
select 1,        15,      null union all
select 4,        16,      null union all
select 5,        17,      null union all
select 4,        16,      null union all
select 4,        16,      null union all
select 3,        18,      null union all
select 3,        19,      null union all
select 2,        20,      null union all
select 4,        21,      null union all
select 1,        22,      null union all
select 2,        23,      null union all
select 3,        24,      null union all
select 5,        25,      null union all
select 4,        16,      null union all
select 4,        16,      null union all
select 4,        16,      null union all
select 3,        26,      null union all
select 2,        27,      null union all
select 6,        28,      null union all
select 2,        29,      null union all
select 3,        30,      null union all
select 4,        31,      null union all
select 1,        32,      null union all
select 1,        33,      null union all
select 2,        34,      null union all
select 5,        35,      null union all
select 2,        36,      null union all
select 3,        37,      null union all
select 4,        38,      null union all
select 1,        39,      null union all
select 2,        40,      null union all
select 3,        41,      null
回复

使用道具 举报

1

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-26 09:45:01 | 显示全部楼层
对不起大家,第一组数据给错了,是:
select 3,        12,      null union all
select 2,        13,      null union all
select 2,        14,      null union all
select 1,        15,      null union all
select 4,        16,      null union all
select 5,        17,      null union all
select 3,        18,      null union all
select 3,        19,      null union all
select 2,        20,      null union all
select 4,        21,      null union all
select 1,        22,      null union all
select 2,        23,      null union all
select 3,        24,      null union all
select 5,        25,      null union all
select 3,        26,      null union all
select 2,        27,      null union all
select 6,        28,      null union all
select 2,        29,      null union all
select 3,        30,      null union all
select 4,        31,      null union all
select 1,        32,      null union all
select 1,        33,      null union all
select 2,        34,      null union all
select 5,        35,      null union all
select 2,        36,      null union all
select 3,        37,      null union all
select 4,        38,      null union all
select 1,        39,      null union all
select 2,        40,      null union all
select 3,        41,      null
回复

使用道具 举报

1

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-26 13:00:01 | 显示全部楼层
题目要求是:
有12块材料:1,2...12 记录激光扫描材料表面所得的数据已存入数据库 要求:把把没有标志位(就是输入哪块材料)的数据加上标志位,并保留每块材料有效数据的最后时间。 例如有效数据范围:1~3 材料间缝隙的数据范围:4~5 最后一块数据扫描结束后又个标志位“6”,然后再向回扫描材料,同样第一块材料扫描完也有标志位“6”
回复

使用道具 举报

0

主题

211

帖子

108.00

积分

新手上路

Rank: 1

积分
108.00
发表于 2020-5-26 16:00:01 | 显示全部楼层
if object_id('tempdb..#tmp') is not null     
drop table #tmp
GO

把GO單獨入一行試試
回复

使用道具 举报

1

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-26 21:45:02 | 显示全部楼层
在我这是另起一行的,搞到verysource上就乱了,对不起,没发好帖子
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-5-30 15:15:01 | 显示全部楼层
题目数据结果

3        12        1
2        13        1
2        14        1
1        15        1
4        16        NULL
5        17        NULL
3        18        1
3        19        1
2        20        1
4        21        NULL
1        22        2
2        23        2
3        24        2
5        25        NULL
3        26        3
2        27        3
6        28        NULL
2        29        4
3        30        4
4        31        NULL
1        32        3
1        33        3
2        34        3
5        35        NULL
2        36        2
3        37        2
4        38        NULL
1        39        1
2        40        1
3        41        1
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-5-30 17:15:01 | 显示全部楼层
2楼数据结果   都可以执行啊
3        12        1
2        13        1
2        14        1
1        15        1
4        16        NULL
5        17        NULL
3        18        1
3        19        1
2        20        1
4        21        NULL
1        22        2
2        23        2
3        24        2
5        25        NULL
3        26        3
2        27        3
6        28        NULL
2        29        4
3        30        4
4        31        NULL
1        32        3
1        33        3
2        34        3
5        35        NULL
2        36        2
3        37        2
4        38        NULL
1        39        1
2        40        1
3        41        1
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-5-30 19:15:01 | 显示全部楼层
1楼数据结果  
3        12        1
2        13        1
2        14        1
1        15        1
4        16        NULL
5        17        NULL
4        16        NULL
4        16        NULL
3        18        1
3        19        1
2        20        1
4        21        NULL
1        22        2
2        23        2
3        24        2
5        25        NULL
4        16        NULL
4        16        NULL
4        16        NULL
3        26        1
2        27        1
6        28        NULL
2        29        4
3        30        4
4        31        NULL
1        32        3
1        33        3
2        34        3
5        35        NULL
2        36        2
3        37        2
4        38        NULL
1        39        1
2        40        1
3        41        1
  兄弟  我这里查询分析器都可以执行 你让我怎么找 ????
回复

使用道具 举报

1

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-6-3 19:30:01 | 显示全部楼层
谢谢大家,我想要的结果是:

标志位形如:1,2,3,4,....,12,12,11,...1,1,2,3....

第一组数据测试正确,但是后面那组数据测试就不对了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表