我又来了,求一个存储过程的写法!

zl194 2009-12-21 04:14:47

--求一个存储过程
--表结构是这样的,

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的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。
--??我想问,怎样做一个存储过程来执行这个操作呢?
...全文
271 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhishouzhetian88 2010-09-20
  • 打赏
  • 举报
回复
存储过程的 if 判断怎么写?
zl194 2009-12-21
  • 打赏
  • 举报
回复
acmain 正解,同样感谢Ken,谢谢各位!
nianran520 2009-12-21
  • 打赏
  • 举报
回复

--写错

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
zl194 2009-12-21
  • 打赏
  • 举报
回复
TB2 的
SELECT '5','已结束','2' UNION
SELECT '5','已结束','2' UNION

即 SID='2'的记录是满足要求的。
nianran520 2009-12-21
  • 打赏
  • 举报
回复

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

ACMAIN_CHM 2009-12-21
  • 打赏
  • 举报
回复
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>
zl194 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chuifengde 的回复:]
只对“已结束”状态更新?
[/Quote]

只对 最大的JDTIME 的状态全部为 ‘已结束’的SID的TB1进行更新。
chuifengde 2009-12-21
  • 打赏
  • 举报
回复
只对“已结束”状态更新?
zl194 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dawugui 的回复:]
SQL code最好给出完整的表结构,测试数据,计算方法和正确结果.

发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
[/Quote]

真的是尽力说明了,但还是讲不清楚,请原谅!
zl194 2009-12-21
  • 打赏
  • 举报
回复
不同的SID 有不同的JDTIME最大值,不一定都是5.
dawugui 2009-12-21
  • 打赏
  • 举报
回复
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
--小F-- 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zl194 的回复:]
引用 1 楼 acmain_chm 的回复:
不需要用存储过程,一个SQL语句就行了。

你是如何确定
          2|运行中                |2
          2|运行中                |3
哪一条是最大值?以SID来判断?

另外你最好举一下能说明--注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。这个情况的例子。


要判断全部。-注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。
[/Quote]

那你这个题目要求的结果是什么??我怎么看TB2没有满足你条件的数据啊
zl194 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dawugui 的回复:]
当表二的JDTIME最大值对应的TB2_ZT的状态为‘已结束’时,修改TB1的状态为‘已结束’


JDTIME最大值还是JDTIME对应的sid为最大值?
[/Quote]

JDTIME 最大值,因为JDTIME并不是唯一的,所以可能有多个JDTIME,需要这多个JDTIME对应的状态都结束,才修改任务计划表。
dawugui 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zl194 的回复:]
引用 1 楼 acmain_chm 的回复:
不需要用存储过程,一个SQL语句就行了。

你是如何确定
          2|运行中                |2
          2|运行中                |3
哪一条是最大值?以SID来判断?

另外你最好举一下能说明--注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。这个情况的例子。


要判断全部。-注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。
[/Quote]
JDTIME的最大值????

JDTIME取5?
chuifengde 2009-12-21
  • 打赏
  • 举报
回复
假设当sid为2时,JDTIME为5一个为结束,一个为运行,那怎么更新
zl194 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]
不需要用存储过程,一个SQL语句就行了。

你是如何确定
          2|运行中                |2
          2|运行中                |3
哪一条是最大值?以SID来判断?

另外你最好举一下能说明--注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。这个情况的例子。
[/Quote]

要判断全部。-注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。
dawugui 2009-12-21
  • 打赏
  • 举报
回复
当表二的JDTIME最大值对应的TB2_ZT的状态为‘已结束’时,修改TB1的状态为‘已结束’


JDTIME最大值还是JDTIME对应的sid为最大值?
ACMAIN_CHM 2009-12-21
  • 打赏
  • 举报
回复
不需要用存储过程,一个SQL语句就行了。

你是如何确定
2|运行中 |2
2|运行中 |3
哪一条是最大值?以SID来判断?

另外你最好举一下能说明 --注意:JDTIME的最大值可能不唯一,当不唯一时要判断是否全部为已结束状态。这个情况的例子。

34,575

社区成员

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

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