Как получить записи, которые будут соответствовать всем строкам с первым подзапросом - PullRequest
0 голосов
/ 20 октября 2011

Привет. Нужна помощь, чтобы решить сложный запрос. Я отправлю введенное имя пользователя (скажем, тест) на запрос. Я должен перечислить других пользователей с той же ролью теста имени пользователя, а также эти имена пользователей должны совпадать со всеми groupid теста имени пользователя. Если у другого пользователя больше групп, чем проверка имени пользователя, это не проблема, но он должен совпадать со всеми существующими groupdid в проверке имени пользователя. Я попробовал следующий запрос. Он не вернет строки, если все групповые совпадения совпадают. Но мне нужны имена пользователей, у которых есть совпадения со всеми идентификаторами группы, вместо того, чтобы не возвращать ни одной строки для точного соответствия.

select 
  group_id 
from 
  user_info us ,group_privilege_details gp 
where 
  login_name='test' 
  and us.user_id = gp.user_id 
EXCEPT
select 
  group_id 
from 
  user_info u ,group_privilege_details g 
where login_name !='test' 
and role_id in (select role_id 
                from user_info 
                where login_name ='test')
and group_id in (select group_id 
                 from user_info us ,group_privilege_details gp 
                 where login_name='test' 
                 and us.user_id = gp.user_id ) 
and g.user_id = u.user_id

Спасибо заранее. И извините за длинное объяснение

1 Ответ

3 голосов
/ 20 октября 2011

Если я правильно понимаю, вы хотите:

select all users,
        not being user test,
        with same role as user test,
        where not exists a group where user test is a member of
            and the other user is not a member of

В SQL это что-то вроде следующего.Я использовал следующие сокращения: OU другой пользователь, TU тестовый пользователь, группы TUG тестовых пользователей, OUG группы других пользователей.

select OU.login_name, OU.user_id
    from user_info OU, user_info TU
    where OU.user_id <> TU.user_id 
        and OU.role_id = TU.role_id 
        and TU.login_name = 'test'
        and not exists (
            select * from group_privilege_details TUG
                where TUG.user_id = TU.user_id
                    and TUG.group_id not in (
                        select group_id 
                            from group_privilege_details OUG 
                            where OUG.user_id = OU.id
                    )
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...