使用CASE和条件更新表(postgresql)

6

我有这些表格:

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

我希望即使是平衡栏也应该根据SID验证进行更新,即:

如果r.sida ='t',则bal=emp1.emp_bal-1,emp1中的emp_bal应更新为批准后的最新bal值;否则,如果r.ssida ='t',则bal = emp_bal-2,emp1中的emp_bal应更新为批准后的最新bal值。

有解决方法吗?

最后,我想查看所有已批准的员工请假记录,以及谁批准了它和他们剩余的休假天数!

详细信息在[SQL FIDDLE] (http://sqlfiddle.com/#!12/3e6a7/18)


在你的澄清之后,我已经撤下了我的回答并取消了踩。你的更新很有道理,也许其他人会进一步研究它。 - Craig Ringer
1个回答

6

你做错了。

在 Update 语句中使用 Use Case 语句而不是在 Case 语句中使用 Update 语句。

比如:

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

Case when **Col10=1** then 5

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

**ELSE 10** END  
**ELSE 15** END

我不明白你的意思,Parth Malhan。你能否在这个SQL fiddle中的Update语句中处理CASE语句? - user2194879

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接