34,838
社区成员




--求一个存储过程
--表结构是这样的,
CREATE TABLE TB1 (SID VARCHAR(20),ZT VARCHAR(20),CMEMO VARCHAR(100)) --任务总表
INSERT INTO TB1
SELECT '1','计划中','备注1' UNION
SELECT '2','运行中','备注2' UNION
SELECT '3','运行中','备注3' UNION
SELECT '4','已结束','备注4'
CREATE TABLE TB2 (JDTIME INT,TB2_ZT VARCHAR(20),SID VARCHAR(20)) --任务明细表
INSERT INTO TB2
SELECT '1','计划中','2' UNION
SELECT '2','运行中','2' UNION
SELECT '3','运行中','2' UNION
SELECT '5','已结束','2' UNION
SELECT '5','已结束','2' UNION
SELECT '1','运行中','3' UNION
SELECT '2','运行中','3' UNION
SELECT '3','运行中','3' UNION
SELECT '5','运行中','3' UNION
SELECT '5','运行中','3'
--表TB1是一个任务总表,表TB2是一个任务明细表。
--要求:当表二的JDTIME最大值对应的TB2_ZT的状态为‘已结束’时,修改TB1的状态为‘已结束’
--注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。
--??我想问,怎样做一个存储过程来执行这个操作呢?
--写错
create proc proc_trans_change_zt
as
begin
update TB1
set ZT = '已结束'
where SID in
(select sid
from
(
select max(JDTIME) as JDTIME,sid,
sum(case TB2_ZT when '已结束' then 1 else 0 end) as [nums]
from TB2
group by sid
) t where [nums] = (select count(1) from TB2 where sid=t.sid and JDTIME=t.JDTIME))
end
create proc proc_trans_change_zt
as
begin
update TB1
set ZT = '已结束'
where SID in
(select sid
from
(
select max(JDTIME) as JDTIME,sid,
sum(case TB2_ZT when '已结束' then 1 else 0 end) as [nums],
count(1) as [count]
from TB2
group by sid
) t where [nums] = [count])
end
update tb1
set ZT='已结束'
where SID in (
select SID
from tb2 b
where not exists (select 1 from tb2
where SID=b.SID and JDTIME>b.JDTIME)
group by SID
having min(case TB2_ZT when '已结束' then 1 else 0 end) =1
)
(1 rows affected)
1> update tb1
2> set ZT='已结束'
3> where SID in (
4> select SID
5> from tb2 b
6> where not exists (select 1 from tb2
7> where SID=b.SID and JDTIME>b.JDTIME)
8> group by SID
9> having min(case TB2_ZT when '已结束' then 1 else 0 end) =1
10> )
11> go
(1 rows affected)
1> select * from tb1;
2> go
SID |ZT |CMEMO
--------------------|--------------------|---------------------------------
1 |计划中 |备注1
2 |已结束 |备注2
3 |运行中 |备注3
4 |已结束 |备注4
(4 rows affected)
1>
最好给出完整的表结构,测试数据,计算方法和正确结果.