我有两张桌子
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
是否可以使用触发器或者使用其他解决方案(例如调用某个过程)?
从我的角度来看,这将是一个坏主意,因为您将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)