大家帮忙看个数据库问题:先谢了。
sql语句 能不能找到数据所对的字段?
比如(课程后面是所在班级此课程的总分,
score1是course1的所有分之和)
表1:
course1 score1 course2 score2 course3 score3 classid
语文 0 数学 0 英语 0 计算机1
物理 0 化学 0 生物 0 计算机2
表2:
studentid course score
2002001 语文 60
表3:
studentid classid
2002001 计算机1
现在操作是这样的:在表2增加一条记录如上,然后在表1
里面跟着修改班级语文课程的分数。
问题是:我怎么根据course就知道修改哪个score
也就是说我加的记录是语文,我怎么根据语文来确定是修改表一中的score1还是score2
另外:这表设计是不是有问题?
sql语句 能不能找到数据所对的字段?
比如(课程后面是所在班级此课程的总分,
score1是course1的所有分之和)
表1:
course1 score1 course2 score2 course3 score3 classid
语文 0 数学 0 英语 0 计算机1
物理 0 化学 0 生物 0 计算机2
表2:
studentid course score
2002001 语文 60
表3:
studentid classid
2002001 计算机1
现在操作是这样的:在表2增加一条记录如上,然后在表1
里面跟着修改班级语文课程的分数。
问题是:我怎么根据course就知道修改哪个score
也就是说我加的记录是语文,我怎么根据语文来确定是修改表一中的score1还是score2
另外:这表设计是不是有问题?
CourseID CourseName 表2:
StudentId CourseID Score 表3:
StudentId ClassId
在sql语句中需要使用case来得到,你需要case course1 when ‘’ then case course2 when ‘’ then
使用这样的语句来对数据进行操作
很不爽的
如果直接使用一条语句进行操作,好像比较困难,需要借助存储过程,或者你把记录取得后在程序中处理完了,整条的update到db中
存储过程也可以啊 但是好象case也不好操作
就是给你个course 你得到的是字段的值啊
怎么判断它是sourse1字段呢呢? 不知道我将清楚没有!
create proc add_score_update_course
(
@studentid nvarchar(20),
@course nvarchar(10),
@score float
)
as
begin transaction
insert into test_score(studentid,course,score)
values (studentid=@studentid,course=@course,score=@score);
update test_course
case course1 then score1=score1+@score
case course2 then score2=score2+@score
case course3 then score3=score3+@score
else score4=score4+@score
where classid in (select classid from test_class where studentid=@studentid);
end;
Create Proc Proc_StudentChengJI
(
@UserCode varchar(30),
@ChengJI float(8)
)
as
--更新表一
UPDATE 表1 SET CHENGJI=@CHENGJI WHERE USERCODE=@USERCODE
--更新表二
UPDATE 表2 SET CHENGJI=@CHENGJI WHERE USERCODE=@USERCODE
//*****第二种方法是用触法器.
谁帮我实现case希望通过course选对应的score
(
@ID uniqueidentifier,
@chengji int
)
as
insert 表1(id,chengji) values (@id,chengji)
update 表2 set chengji=@chengji where id=@id
update 表3 set chengji=@chengji where id=@id
比如你要更新的是语文 那么你写
case course1 when ‘语文’ then score1 = ... ,case course2 when ‘语文’ then score2 =
就这样,如果你要更新其他的,你就把语文这个值换成你要更新的,这个应该是个变量,程序控制传入的吧
DECLARE @src VARCHAR(10)
SELECT @src=RTRIM(src) FROM
(SELECT course1,score1,scr=1 FROM tb1
UNION
SELECT course2,score2,scr=2 FROM tb1
UNION
SELECT course3,score3,scr=3 FROM tb1) base
WHERE course1='语文' --是不是语文根具你增加的记录来决定
DECLARE @score INT
--@score代表那个新增记录的分值,具体是你用变量取来还是在触发器中用连接获取,这个看你具体情况,我这里暂以变量代,主要为提供一个完整思路
EXEC ('UPDATE tb1 SET score'+RTRIM(@src)+'=score'+RTRIM(@src)+'+RTRIM(@score)+' WHERE course' + RTRIM(@src) + '=''语文''')当然,是用触发器还是用存储过程在特定时调用,看你具体要求.
没测试,可能有手误.
这好象可以 ,研究ing . 谢谢fcuandy(边打魔兽边回贴)
UNION
SELECT course2,score2,scr=2 FROM tb1
UNION
SELECT course3,score3,scr=3 FROM tb1实际上它已经把表结构转换了, 并且 src列记录了 新产生的记录原来在表中排布的位置
比如 语文在表1是course1 -->所以对应 score1
而 如果语文在表1是course2 -->对应的必须是score2
第一步:我要增加表记录在表2 这很好实现
第二步:在表一做出相应更改 难点在动态找course对应的score
你们回帖 我都看了 首先感谢各位帮忙
但还是没实现我的要求 fcuandy(边打魔兽边回贴)很接近
但还是要改进 ,我自己也在参照着做.