我有下表result
:
roll integer
c_id varchar(20)
marks number(6,2)
grade varchar(6)
gpa number(3,2)
cgpa number(3,2)
year varchar(10)
term varchar(10)
还有courses
和student
个表格。我已在result
表中输入了课程标记,并希望在成绩栏中指定相应的成绩。我想在等级列中插入A +,大于或等于240的标记,A大于等于210且小于240。
我该怎么做?
这是DDL:
drop table result;
drop table courses;
drop table student;
create table student(
roll number(10),
fname varchar(30),
lname varchar(30),
department varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (roll)
create table courses(
c_id varchar(30) NOT NULL,
c_name varchar(30),
credit integer CHECK(credit>0 and credit<5)
);
ALTER TABLE COURSES ADD PRIMARY KEY (c_id)
ALTER TABLE COURSES ADD UNIQUE KEY (c_id)
create table result(
roll number(10),
c_id varchar(30),
marks number (6,2),
year varchar (10),
term varchar (10),
gpa number(3,2),
cgpa number(3,2),
grade varchar (4)
);
ALTER TABLE result ADD FOREIGN KEY (roll) REFERENCES student(roll)
ALTER TABLE result ADD FOREIGN KEY (c_id) REFERENCES courses(c_id)
以下是结果数据:
insert into result (roll,c_id,marks,year,term) values (1307019,'cse 3103',200,'2nd','1st');
insert into result (roll,c_id,marks,year,term) values (1307019,'cse 3105',210,'2nd','1st');
insert into result (roll,c_id,marks,year,term) values (1307019,'cse 3107',190,'2nd','1st');
答案 0 :(得分:1)
您可以对条件表达式使用update
语句来更改现有数据并填充grade
列。
这应该有效:
update result
set grade =
case
when marks >= 240 then 'A+'
when marks >= 210 and marks < 240 then 'A'
-- continue adding more clauses below
-- else 'B' -- maybe a default value?
end;
答案 1 :(得分:1)
尝试此数据库复合触发器
这里我给你数据库触发器,当你插入或更新记录时它将在桌子上触发,这可以用特定条件完成
CREATE OR REPLACE TRIGGER trg_result
FOR INSERT OR UPDATE ON result
COMPOUND TRIGGER
BEFORE EACH ROW IS
BEGIN
CASE
WHEN INSERTING OR UPDATING THEN
:NEW.GRADE := (CASE
WHEN :NEW.marks >= 240 THEN
'A+'
WHEN :NEW.marks >= 210 and :NEW.marks < 240 THEN
'A'
ELSE
'B'
END);
END CASE;
END BEFORE EACH ROW;
END trg_result;
触发器的主要好处是我们可以在您的示例中自动更新等级,这取决于插入和更新时的标记。
在创建触发器之后再次触发insert语句并查看result.your grade列是作为指定条件插入的。
复合触发器的完整描述在这里
https://oracle-base.com/articles/11g/trigger-enhancements-11gr1
我希望这可能会有所帮助。
答案 2 :(得分:1)
有两种自然的方法可以做到这一点。为了说明我简化了问题(在对原始问题的评论中,我指出了应该在设置中更改的一些事项)。
虚拟专栏方法:
create table results (
roll number,
c_id number,
mark number(6,2), -- why "marks"? it should be "mark"
grade varchar(6) as ( -- oversimplified, change as needed
case when mark >= 240 then 'A+'
when mark >= 210 then 'A'
else 'F--'
end
)
);
在此安排中,您只需插入roll, c_id, s_id, mark
的值 - 如果您还尝试输入grade
的值,则会收到错误消息。像这样使用:
SQL> insert into results (roll, c_id, mark) values (322245, 316, 235);
1 row created.
SQL> insert into results (roll, c_id, mark) values (322673, 316, 190);
1 row created.
SQL> select * from results;
ROLL C_ID MARK GRADE
---------- ---------- ---------- ------
322245 316 235 A
322673 316 190 F--
2 rows selected.
这种方法的最大弱点是不同字母等级的断点直接在表格定义中进行了硬编码。
更好的方法是:
查看强>
创建一个包含c_id, year, term
的单独表格,以及每个字母等级的最低要求分数。这与results
表分开维护。
然后创建一个加入results
表和此助手表的VIEW,以计算标记中的字母等级,加入c_id, year, term
以及mark
上更复杂的条件。
不确定OP想要走那么远;如果需要,我可以发布这种方法的简单实现。