oracle表中自动改变状态

Poi*_*ter 4 sql oracle plsql

我有两张桌子

user (user_id, username, status )
Run Code Online (Sandbox Code Playgroud)

状态 --> (1 - 主动,0 - 被动)

user_work (user_work_id, user_id, status)
Run Code Online (Sandbox Code Playgroud)

状态 --> (1 - 主动,0 - 被动)

如果user_work表中某些用户没有活动状态,如何在用户表 status = 0中自动设置。如果用户表中的user_work中的某些用户处于活动状态,则设置状态 = 1

是否可以使用触发器或者使用其他解决方案(例如调用某个过程)?

Lit*_*oot 5

从我的角度来看,这将是一个坏主意,因为您将status信息保存在两个表中(所以再见规范化)。如果您必须了解某人的状态,请查询它。

示例表:

SQL> select * from t_user;

   USER_ID USERNAM
---------- -------
         1 Little
         2 Foot
         3 Pointer     --> doesn't have STATUS in USER_WORK

SQL> select * from user_work;

USER_WORK_ID    USER_ID     STATUS
------------ ---------- ----------
         100          1          0
         101          1          1   --> last status for USER_ID = 1 is 1
         102          2          1   --> last (and only) status for USER_ID = 2 is 1

SQL>
Run Code Online (Sandbox Code Playgroud)

查询(假设最后一个状态(按USER_WORK_ID降序排序)是某人的当前状态;如果表中没有行USER_WORK,则 status = 0)。

SQL> with temp as
  2    (select w.user_id, w.status,
  3            row_number() over (partition by w.user_id order by w.user_work_id desc) rn
  4     from user_work w
  5    )
  6  select u.user_id, u.username, nvl(t.status, 0) status
  7  from t_user u left join temp t on t.user_id = u.user_id
  8                                and t.rn = 1;

   USER_ID USERNAM     STATUS
---------- ------- ----------
         1 Little           1
         2 Foot             1
         3 Pointer          0

SQL>
Run Code Online (Sandbox Code Playgroud)

或者,一种简单的方法,创建一个视图

SQL> create or replace view v_user_status as
  2  with temp as
  3    (select w.user_id, w.status,
  4            row_number() over (partition by w.user_id order by w.user_work_id desc) rn
  5     from user_work w
  6    )
  7  select u.user_id, u.username, nvl(t.status, 0) status
  8  from t_user u left join temp t on t.user_id = u.user_id
  9                                and t.rn = 1;

View created.

SQL> select * From v_user_status;

   USER_ID USERNAM     STATUS
---------- ------- ----------
         1 Little           1
         2 Foot             1
         3 Pointer          0

SQL>
Run Code Online (Sandbox Code Playgroud)