我在Oracle数据库中有两个表:USERS
和USERLOG
USERS
包含所有系统用户详细信息(IDCOL
,EMAIL
,ISLOCKED
等。)
USERLOG
是用户登录系统的日志(USERID
,LOGIN
(日期字段))
关键字段:USERS.IDCOL
= USERLOG.USERID
删除的用户将从USERS表中删除;因此,USERLOG
中会有一些ID与USERS
表格不匹配。
我想对用户列表做两件事:
锁定过去9个月内未访问过系统的所有用户(即他们的ID在过去9个月内未显示在USERLOG
中,我想这会使用以下内容:
months_between( SYSDATE , USERLOG.LOGIN ) <= 9
USERLOG
中只有一个条目的所有用户,只要它不在上个月/ 30天内(即创建帐户时)要锁定用户,我需要将USERS.ISLOCKED
列从0
更新为1
非常感谢
答案 0 :(得分:1)
months_between(SYSDATE,USERLOG.LOGIN)&lt; = 9
1)在这种情况下,userlog.login不是来自单行,而是一系列登录中的最长登录时间。有不同的方法可以做到这一点,但我认为以下查询更清楚地捕获了需求。 “过去9个月内没有登录的所有用户”
select *
from users usr
where not exists (
select 1
from userlog log
where usr.user_id = log.user_id
and log.login > add_months(sysdate,-9)
)
检查以确保您获得的是用户,寻找并将此选择转换为删除。
2)这将满足两个规则的两个不同条件。
select *
from users
where not exists (
select 1
from userlog
where users.userid = userlog.userid
and userlog.login > add_months(sysdate,-1)
) AND (
1 = (select count(*)
from userlog
where users.userid = userlog.userid)
)
答案 1 :(得分:1)
Couldent测试它但是第一个
update users a
set islocked = 1
where exists (
select 1
from userlog b
where a.idcol = b.userid
group by b.userid
having months_betwen(sysdte , max(userlog)) <= 9)
第二个,如果我做对了,你想锁定30天前只有一个入口的用户....如果是的话那么
update users set islocked = 1
where idcol in (
select userid
from userlog
group by userid
having count(*) = 1
and count(case when month_between(login , sysdate) < 1 then 1 else null end) = 0)
所以我基本上算上个月和整体的入口。 语法可能会关闭,我不能在这里运行一个例子。