SQL基于另一个表更新Oracle表

时间:2013-04-08 14:56:58

标签: sql oracle sql-update

我在Oracle数据库中有两个表:USERSUSERLOG

  • USERS包含所有系统用户详细信息(IDCOLEMAILISLOCKED等。)

  • USERLOG是用户登录系统的日志(USERIDLOGIN(日期字段))

关键字段:USERS.IDCOL = USERLOG.USERID

删除的用户将从USERS表中删除;因此,USERLOG中会有一些ID与USERS表格不匹配。

我想对用户列表做两件事:

  1. 锁定过去9个月内未访问过系统的所有用户(即他们的ID在过去9个月内未显示在USERLOG中,我想这会使用以下内容:

    months_between( SYSDATE , USERLOG.LOGIN ) <= 9
    
  2. 锁定USERLOG中只有一个条目的所有用户,只要它不在上个月/ 30天内(即创建帐户时)
  3. 要锁定用户,我需要将USERS.ISLOCKED列从0更新为1

    非常感谢

2 个答案:

答案 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)

所以我基本上算上个月和整体的入口。 语法可能会关闭,我不能在这里运行一个例子。