问两道问题:

suspension 2006-12-20 11:31:59
第一:
触发器的特点是什么?
如下表所示,当向产品入库明细表products_input写入记录,即进行入库操作时,可通过触发器维护相应产品的库存量,即修改表products_storage的num值。如果产品入库操作包括了插入新记录、修改原有记录、删除原有记录,试写出相应的触发器。
产品入库明细表
products_input(
id int primary key, 主键
product_id int 产品编号,外键
rq datetime 入库时间
num int) 入库数量

产品库存表
products_storage(
product_id int 产品编号,主键
num int) 产品库存

第二:
使用游标技术,从学生表STUDENTS(ID,NAME,……)中逐一读出学生姓名NAME,将学生姓名插入到表STUDENTS_NAME(NAME)中。试写出该功能的SQL语句。
...全文
278 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
feifeiyaqi3 2006-12-21
  • 打赏
  • 举报
回复
declare @studName varchar(100)
declare studCur cursor for
select name from student
open studCur
fetch next from studcur into @studName
while @@fetch_status=0
begin
insert into studentName values(@studName)
fetch next from studcur into ()//???
end
close studCur
DEALLOCATE studCur


十一月猪 2006-12-21
  • 打赏
  • 举报
回复

一、找出缺考的学生名单,输出如下格式:

Class_id(班级) Stu_name(姓名) Lession_des(课程)

B001 王五 数学
…… …… ……
要求: 如果不使用游标,如何实现;
如果使用游标,又如果实现?
select class_id ,
st_name ,
lession_des
from
(
select stu_id ,
lession_id
from t_stu_profile a ,
t_lession b
where not exists (select 1 from t_score where a.stu_id = stu_id and b.lession_id = lession_id)
) aa , t_stu_profile bb, t_lession cc
where aa.stu_id = bb.stu_id
and aa.lession_id = cc.lession_id

二、找出五门课程中的年级前三名,输出如下格式:(假设前三名不出现并列的情况)


select aa.stu_id , bb.st_name, cc.lession_des , aa.score
from t_score aa, t_stu_profile bb , t_lession cc
where aa.stu_id = bb.stu_id
and aa.lession_id = cc.lession_id
and aa.score in ( select top 3 score from t_score where aa.lession_id = lession_id)


Lession_des(课程) 第一名 第二名 第三名
语文
数学
英语
物理
化学 …… …… ……
要求:如果不使用游标,如何实现;如果使用游标,又如果实现?

三、输出06101班的学生成绩单,格式如下:

姓名 语文 数学 英语 物理 化学 总分

…… …… …… …… …… …… ……
要求:如果不使用游标,如何实现;如果使用游标,又如果实现?

select st_name ,
Max(case when lession_des = '语文' then Isnull(score,0) end )as '语文',
Max(case when lession_des = '数学' then Isnull(score,0) end )as '数学',
Max(case when lession_des = '历史' then Isnull(score,0) end )as '历史',
Max(case when lession_des = '英语' then Isnull(score,0) end )as '英语',
sum(score)
from
(
select aa.stu_id , bb.st_name, cc.lession_des , aa.score
from t_score aa, t_stu_profile bb , t_lession cc
where aa.stu_id = bb.stu_id
and aa.lession_id = cc.lession_id
and bb.class_id = '06101'
) dd
group by st_name

四、假如成绩表增加考试日期Test_Date,记录高中三年大大小小每次考试成绩。
请问:如何求出高三阶段(2005年),每位学生的每门课的平均考试成绩。
(缺考以及60分以下的成绩不计入平均,如高三数学共考试20次,B001缺考一次、另一次成绩58分,则B001的平均考试成绩以18次计算)。
输出格式同试题三。


select st_name ,
Sum(case when lession_des = '语文' then Isnull(score,0) end ) / count(1) as '语文',
SUM(case when lession_des = '数学' then Isnull(score,0) end ) / count(1) as '数学',
SUm(case when lession_des = '历史' then Isnull(score,0) end ) / count(1) as '历史',
SUm(case when lession_des = '英语' then Isnull(score,0) end ) / count(1) as '英语',
sum(score) / / count(1) as '总平均'
from
(
select aa.stu_id , bb.st_name, cc.lession_des , aa.score
from t_score aa, t_stu_profile bb , t_lession cc
where aa.stu_id = bb.stu_id
and aa.lession_id = cc.lession_id
and aa.score > 60
) dd
group by st_name
zhang_yzy 2006-12-21
  • 打赏
  • 举报
回复
都有人写了,路过一下吧!
pao1uo 2006-12-21
  • 打赏
  • 举报
回复
1、
Create Trigger Tri_Test
On products_input
For Insert,Update,Delete
As

update s
set num=s.num+t.num
from products_storage s,(
select product_id,sum(num) as num
from (
select product_id,num from inserted
union all
select product_id,-num from deleted
) as t1
group by product_id
) as t
where s.product_id=t.product_id

insert products_storage( product_id,num)
select product_id,sum(num) as num
from (
select product_id,num from inserted
union all
select product_id,-num from deleted
) as t
where not exists (
select 1 from products_storage s
where s.product_id=t.product_id
)
group by product_id

go
pao1uo 2006-12-21
  • 打赏
  • 举报
回复
2.
declare @studentname varchar(80)
DECLARE Student_cursor CURSOR FOR
SELECT Name
FROM Student
OPEN Student_cursor
FETCH NEXT FROM Student_cursor INTO @studentname
WHILE @@FETCH_STATUS = 0
BEGIN
Insert Students_Name(Name) select @studentname
FETCH NEXT FROM titles_cursor INTO @studentname --一楼这里笔误
END
CLOSE Student_cursor
DEALLOCATE Student_cursor
xeqtrl982 2006-12-20
  • 打赏
  • 举报
回复
Create Trigger Tri_Test
On products_input
For Insert,Update,Delete
As
--Insert
If Update(num) And Exists(Select 1 From Inserted)
update A
set num=num+ISNULL(B.num,0)
From products_storage A,inserted B
where A.productid=b.productid
--Delete
update A
set num=num-ISNULL(B.num,0)
From products_storage A,inserted B
where A.productid=b.productid

--Update
If Update(num) And Exists(Select 1 From Deleted) And Exists(Select 1 From Inserted)
..自己写吧,困了!
xeqtrl982 2006-12-20
  • 打赏
  • 举报
回复
2.
declare @studentname varchar(80)
DECLARE Student_cursor CURSOR FOR
SELECT Name
FROM Student
OPEN Student_cursor
FETCH NEXT FROM Student_cursor INTO @studentname
WHILE @@FETCH_STATUS = 0
BEGIN
Insert Students_Name(Name) select @studentname
FETCH NEXT FROM titles_cursor INTO @title
END
CLOSE Student_cursor
DEALLOCATE Student_cursor

34,590

社区成员

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

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