2016-07-23 2 views
3

У меня есть следующая таблица 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, А для более чем 210 и менее 240.

Как это сделать?

Вот DDL:

Вот данные результата:

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

Почему вы добавляете как первичный ключ И уникальный ключ в тот же столбец в той же таблице? Вы должны (вероятно) добавить составной первичный ключ в 'results', из' roll, c_id, year, term'. Затем - почему вы держите «gpa» в той же таблице, где вы держите оценки для отдельных курсов? «gpa» должен быть вычислен, а не сохранен. – mathguy

ответ

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; 
+0

почему он не работает ... ссылка: http://paste.ubuntu.com/20586820/ – ashik

+0

@ashik Я не знаю. Вы получаете сообщение об ошибке? – jpw

+0

нет, но он не работает, а не обновляется. – ashik

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; 

Основные преимущества триггера - мы можем автоматически обновить оценку, которая зависит от маркировки при вставке и обновлении в вашем примере.

после создания триггера запустите свою инструкцию для вставки снова и увидите результат. Ваш столбец класса вставляется в качестве указанного условия.

полное описание соединения спускового здесь

https://oracle-base.com/articles/11g/trigger-enhancements-11gr1

я надеюсь, что это может помочь.

+0

почему он не работает ..... проверьте, пожалуйста, ссылку: http://paste.ubuntu.com/20586820/ – ashik

+0

, если мы используем обновление, тогда его обязательно возобновить смену данных. –

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.

Затем создайте VIEW соединяющую results стола и этот вспомогательный стол для вычисления буквенных от знака, соединяющий на c_id, year, term и более сложное условие на mark.

Не уверен, что OP хочет зайти так далеко; При желании я могу опубликовать простую реализацию этого подхода.

Смежные вопросы