触发器问题.两表操作和对一个表操作.(分不够再加)

电动汽车砖家刘博士 2004-08-06 09:34:12
有如下两个表
表A 病人基本信息 表B 住院情况

表A:(病人基本信息)
住院号 姓名 性别 年龄 ...
123 老王 男 20
234 老李 男 21
345 老张 男 22
其中,以"住院号"为索引.

表B:(住院情况)
住院号 住院次数 ...
123 1
123 2
234 1
其中,住院号和住院次数一起组成索引.也就是说一个病人的基本信息只有一个,但是可能住院了好几次,每住院一次,就在"住院情况"表里面加入一条记录.

现在的问题如下:
1:在建立病人基本信息的时候,自动将住院号填入住院情况里面,因为每一个病人有可能不住院,也有可能住院很多次,也就是说,要么自动将住院号填入"住院情况"表里,要么不填.这个怎么来控制?以及触发器怎么写.
2:当病人已经住了一次或者几次以后,在下一次的时候,自动生成住院次数号码.这个问题可能简单一些.

说明,这个系统的开发,后台数据库用sql server 2000,前台用vb.net,就第一个问题,究竟是在前台操作好,还是在后台用触发器操作好?

3:我是这样想的,在前台输入病人的基本信息的时候,我在页面上添加一个check,如果点上了就表示该病人有住院.否则就表示该病人没有住院,也就是说我通过前台的控制能否控制后台数据库里面选择性的触动相应的触发器?




...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
是这样子的,我想每一个病人只有一个基本信息,但是由于每一个病人有可能一次都不住院,有可能住好几次院,这样子,就如我的题目究竟该怎么设计表才好呢?

to w_rose(w_rose)
你是不是没有看明白我的题目啊
l_yx123@sina.com.cn 联系
好好切磋一下啊
w_rose 2004-08-12
  • 打赏
  • 举报
回复
create trigger [住院情况_记录住院数] on [住院情况] after insert as
update x set [住院次数]=[住院次数]+p.[次数]
from [住院情况] as x inner join (select [病人编号],count(*) as [次数]
from inserted group by [病人编号]) as p
on x.[病人编号]=p.[病人编号]
go
w_rose 2004-08-12
  • 打赏
  • 举报
回复
正常的逻辑中,触发器很好写:

create trigger [住院情况_记录住院数] on [住院情况] after insert as
update x set [住院次数]=[住院次数]+c.[次数]
from [住院情况] as x inner join
(select [病人编号],count(*) as [次数] from inserted group by [病人编号]) as p
on x.[病人编号]=p.[病人编号]
go
w_rose 2004-08-12
  • 打赏
  • 举报
回复
在建立病人基本信息的时候,自动将住院号填入住院情况里面,因为每一个病人有可能不住院,也有可能住院
---------------------------------------------------------------------------
这也是逻辑问题。



其实,首先解决逻辑问题,用大家都遵循的有效的思考方法,对自己设计和维护程序也非常有利。


常人所能接受的逻辑可能是这样:
1. 如果在住院表中没有记录,就说明没有住过院。是否另外找个地方保存个check不重要。
2. 既然表B是保存病人住院次数,那么就不应该表达病人“每一次”住院信息,否则必乱。
3. 病人既然可能不住院,竟然用“住院号”作主键标志,设计者是成心相让读者搞乱心智哦!
3. 如果B表仅仅作这个使用,那么显然每个病人(主键)单独一条记录,A表中多出一个“住院次数”字段不就得了?
w_rose 2004-08-12
  • 打赏
  • 举报
回复
每住院一次,就在"住院情况"表里面加入一条记录
----------------------------------------------
那么,
123 2
这条记录就让人摸不着头脑了。这样没办法回答问题。
yang771 2004-08-12
  • 打赏
  • 举报
回复
樓主的第一個問題.可以按自己所提出的第三點.如果說你前臺不給出一個是否信院的
信息.后臺數據庫怎麼知道此人是否要住院呢. 而第二個問題則可以用后臺數據庫編寫
觸發器來完成.

create proc update_住院次數 on 表A
as
declare @check int --前臺表示的住院信息(可設"0"和"1"兩個狀態值)
select @check=check from inseted
if @check=1
update 表B set 住院次數=max(X.住院次數)+1 from 表B X,Inserted Y where X.住院號=Y.住院號
Go
  • 打赏
  • 举报
回复
singlev(wesley)兄弟,你能够说清楚一点么?
wesley_qq 2004-08-09
  • 打赏
  • 举报
回复
A表多建一个判断是否住院的字段
在表A建个触发器
after insert
if 是否住院=true
begin
insert into 表B(住院号) values(select 住院号 from inserted)
end

表B建个触发器
after insert
update 表B set inserted.住院次数=(select count(*) from 表B where 住院号=inserted.住院号)
  • 打赏
  • 举报
回复
兄弟们,给我一个解决方法啊
  • 打赏
  • 举报
回复
这个表B里面还有很多字段的.
victorycyz 2004-08-06
  • 打赏
  • 举报
回复

刚才我说的不对,看错了。
victorycyz 2004-08-06
  • 打赏
  • 举报
回复

只要在表A中加一个“是否住院”的字段就行了。表B不需要。
陈燕君 2004-08-06
  • 打赏
  • 举报
回复
这种操作最好在后台操作(或用存储过程)
  • 打赏
  • 举报
回复
难道就没有人会么?

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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