2013-04-08 4 views
1

У меня есть две таблицы в базе данных Oracle: USERS и USERLOGSQL, чтобы обновить таблицу Oracle, основанную на другой таблице

  • USERS содержит все детали системы пользователя (IDCOL, EMAIL, ISLOCKED и т.д.)

  • USERLOG представляет собой журнал, когда пользователь регистрируется на систему (USERID, LOGIN (поле даты))

поле Ключ: USERS.IDCOL = USERLOG.USERID

Удалены пользователи будут удалены из таблицы USERS; поэтому в USERLOG будут указаны ID, которые не будут соответствовать таблице USERS.

Я хочу сделать две вещи в списке пользователей:

  1. Блокировка любых пользователей, которые не доступны системы за последние 9 месяцев (т.е. их ID не появляется в USERLOG в последние 9 месяцев, которые я думаю, будет использовать что-то вроде:

    months_between(SYSDATE , USERLOG.LOGIN) <= 9 
    
  2. Блокировка всех пользователей, которые имеют только одну запись в USERLOG, до тех пор, как это не в течение последнего месяца/30 дней (т.е. при создании учетной записи)

Чтобы заблокировать пользователя, мне нужно обновить USERS.ISLOCKED столбец из 0 в 1

Большое спасибо

ответ

1

MONTHS_BETWEEN (SYSDATE, USERLOG.LOGIN) < = 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) Это было бы 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) 
    ) 
+0

Rajesh, я отредактировал ваш ответ, чтобы обновить пару названий полей, а также исправил пару проблем с синтаксисом во втором блоке кода, но в противном случае это место, спасибо очень. – Rob

+0

По какой-то причине мои изменения не были приняты, если другие используют, во втором кодовом блоке 'add_months (sysdate-1)' требуется запятая перед '-1', а левая скобка нужна до' 1 = (' – Rob

+0

Сделал изменения. Спасибо, Роб. –

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) 

так что я b а также подсчет входов в последний месяц и в целом. синтаксис может быть выключен, я не могу запустить пример здесь.

+0

haki, спасибо за ответ, работало пятно Раджеша, поэтому я принял его, ваш ответ был полезен, но извинения у меня недостаточно, чтобы« отметить как полезный ». Еще раз спасибо. – Rob

Смежные вопросы