如何相对于表的其他列的值在一列中插入值

时间:2016-07-23 09:28:38

标签: database oracle

我有下表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)

还有coursesstudent个表格。我已在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');

3 个答案:

答案 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想要走那么远;如果需要,我可以发布这种方法的简单实现。