2013-07-08 2 views
4

я есть таблицы ::Обновление таблицы с использованием случая и условий (POSTGRESQL)

CREATE TABLE emp1 
(
    eid integer NOT NULL, 
    ename character varying(20), 
    sid integer, 
    ssid integer, 
    CONSTRAINT pk_eid PRIMARY KEY (eid) 
); 

CREATE TABLE leave_type 
(
    eid integer, 
    lid integer, 
    lnum integer, 
    emp_bal integer, 
    sno serial NOT NULL, 
    CONSTRAINT pk_sno PRIMARY KEY (sno), 
    CONSTRAINT fk_eid FOREIGN KEY (eid) 
     REFERENCES emp1 (eid) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
);//emp_bal-->employee balance leaves which is considered as 8 

CREATE TABLE result 
(
    eid integer, 
    lid integer, 
    sd date, 
    ed date, 
    sida boolean, 
    ssida boolean, 
    rsno serial NOT NULL, 
    CONSTRAINT pk_rsno PRIMARY KEY (rsno) 
); 

вставленной данные

emp1 
----- 
eid | ename | sid | ssid 
-----+-------+-----+------ 
    1 | a  | 2 | 8 
    3 | c  | 4 | 9 
    2 | b  | 3 | 8 
    4 | d  | 2 | 8 
    5 | e  | 2 | 8 
    6 | f  | 4 | 9 

(6 строк)

leave_type 
---------- 
eid | lid | lnum | emp_bal | sno 
-----+-----+------+---------+----- 
    1 | 0 | 1 |  8 | 1 
    3 | 0 | 1 |  8 | 2 
    5 | 0 | 1 |  8 | 3 
    1 | 1 | 1 |  8 | 4 
    1 | 2 | 2 |  8 | 5 
(5 rows) 

result 
------- 
eid | lid |  sd  |  ed  | sida | ssida | rsno 
-----+-----+------------+------------+------+-------+------ 
    1 | 0 | 2013-01-01 | 2013-01-01 | t | f  | 1 
    3 | 0 | 2013-01-09 | 2013-01-09 | t | f  | 2 
    5 | 0 | 2013-01-11 | 2013-01-11 | t | f  | 3 
    1 | 1 | 2013-02-14 | 2013-02-14 | t | f  | 4 
    1 | 2 | 2013-03-15 | 2013-03-16 | f | t  | 5 
(5 rows) 

Запрос:

Я хочу, чтобы таблица утверждения обновить

CREATE TABLE approval 
    (
     eid integer, 
     lid integer, 
     asid integer, 
     bal integer 
    ); 

как выход

 eid | lid | sid |bal 
    -----+-----+---+-- 
     1 | 0 | 2 | 7 
     3 | 0 | 4 | 7 
     5 | 0 | 2 | 7 
     1 | 1 | 2 | 6 
     1 | 2 | 8 | 4 
    (5 rows) 

условия :: я попробовал этот запрос для получения SID в таблице утверждения, как указано ниже :

CASE WHEN r.sida='t' 
    THEN (update approval set a.asid=e.sid where a.eid=e.eid from emp1 e,approval a) 
WHEN r.ssida='t' 
    THEN (update approval set a.asid=e.ssid where a.eid=e.eid from emp1 e,approval a) 
ELSE 0 
END 

я хочу даже столбец баланс должен быть обновлен базирование на с.и.д. проверки, т.е..,

СЛУЧАЙ если r.sida = «т», то BAL = emp1.emp_bal-1 и emp_bal в emp1 должен быть обновлен до последней значение бАЛ утверждения иначе, если r.ssida = «т» то BAL = emp_bal-2 и emp_bal в emp1 должен быть обновлен до последней стоимости бАЛ утверждения

есть ли способ решить эту проблему?

, наконец, я хочу видеть все листовки сотрудников, которые одобрены и кто его одобрил, и там баланс оставляет слева!

Полные детали в [SQL FIDDLE] (http://sqlfiddle.com/#!12/3e6a7/18)

+0

Я удалил свой ответ и downvote после ваших уточнений. Ваше обновление имеет смысл. Кто-то еще может заглянуть в него. –

+0

Спасибо u .. @ craig ringer –

ответ

3

Вы делаете неправильно.

Заявление о применении с заявлением о обновлении вместо использования отчета о обновлении внутри случая.

Как

Update **Table** 
Set **Col1**= 

Case when **Col10=1** then 5 

else case when **Col10=2** THEN 6 

**ELSE 10** END 
**ELSE 15** END 
+0

i did not get u @ parth Malhan Могу ли я обработать оператор CASE в заявлении об обновлении для этого [скрипта SQL] (http://sqlfiddle.com/#!12/3e6a7/18) –

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