Чтобы отображать только активный статус для одного конкретного идентификатора и для одного и того же идентификатора, все статусы должны быть отключены

Я хочу отобразить список лиц, которые активны только для одного приложения, начинающегося с буквы «a», а все остальные приложения должны быть «ОТКЛЮЧЕНЫ». Идентификатор человека находится в одной таблице, а сведения о приложении будут в другой таблице.

Необходимо выбрать идентификатор человека, который удовлетворяет следующему условию. Я приложил результаты модели, в которой я присоединился к трем таблицам. Мне нужно выбрать пользователя, как показано ниже (выделено),

введите описание изображения здесь

person_id - это первичный ключ.

Запрос используется следующим образом:

SELECT * FROM  (select   p.person_id from ur_username u join  ur_username_person up on u.username_id=up.username_id 
join ur_person p on up.person_id=p.person_id 
WHERE ( U.USERNAME  LIKE 'A-%' OR U.USERNAME  LIKE 'a-%')
AND u.status='ACTIVE' AND U.ROLE_ID =123 ) E
WHERE p.person_id IN ( select   p.person_id from ur_username u join  ur_username_person up on u.username_id=up.username_id 
join ur_person p on up.person_id=p.person_id 
WHERE ( U.USERNAME  NOT LIKE 'A-%' OR U.USERNAME NOT LIKE 'a-%')
AND u.status='DISABLED' AND U.ROLE_ID =123 )

Я также получаю человека, который активен в любом другом приложении.

В приведенной выше таблице я хочу, чтобы имя пользователя a-pri (начинается с a-) также со статусом «АКТИВНЫЙ», все остальные статусы для идентификатора приложения 123 отключены. для этого идентификатора 123 не активны никакие другие имена пользователей.


person madhan    schedule 22.12.2017    source источник
comment
Вы используете MS SQL Server или Oracle? Не помечайте не задействованные продукты.   -  person jarlh    schedule 22.12.2017


Ответы (2)


Мы можем попробовать агрегировать Application_id, а затем проверить две вещи. Во-первых, мы можем проверить, что активное имя пользователя a-pri появляется только один раз. Во-вторых, мы можем утверждать, что только одна запись отображается как активная. Казалось бы, эти два условия соответствуют вашим требованиям.

SELECT
    Application_id
FROM yourTable
GROUP BY
    Application_id
HAVING
    SUM(CASE WHEN username='a-pri' AND status='ACTIVE' THEN 1 ELSE 0 END) = 1 AND
    SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) = 1;

Перейдите по ссылке ниже, в которой используется больший набор выборочных данных, чтобы охватить больше крайних случаев.

Демо

person Tim Biegeleisen    schedule 22.12.2017

Возможно я не правильно понимаю ваш запрос, но вот мой код:

Select username from your_rable where status = 'ACTIVE';

Если это не то, что вы собираетесь получить, предоставьте дополнительный набор данных, возможно, для большего количества Application_id, а также необходимого результата.

person mikcutu    schedule 22.12.2017