2011-10-20 7 views
0

こんにちは、いくつかの複雑なクエリを解決するための助けが必要です。入力したユーザ名(testと言う)をクエリに送信します。私はユーザー名テストの同じ役割を持つ他のユーザーをリストアップする必要がありますまた、それらのユーザー名はユーザー名テストのすべてのgroupidと一致する必要があります。他のユーザーがusernameよりも多くのグループを持っている場合、testは問題ではありませんが、すべてのgroupdidに一致する必要があります。私は次のクエリを試しました。すべてのgroupidが一致すれば、行は返されません。しかし、正確な一致のために行を返すのではなく、すべてのグループIDと一致するユーザー名が必要です。最初のサブクエリですべての行と一致するレコードを取得する方法

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 

ありがとうございます。私が正しく理解していればと長い説明

+0

5行(またはそれ以上)の入力データと出力行を生成する例を挙げることもできますか? – Johan

+0

私はどちらが理解しやすいか、コードや説明を決定しようとしています... –

+0

これは関係分割の問題だと思います。同様の問題に対する多くの(私はたくさんの)意味の異なるアプローチでこの質問を参照してください:http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in-a-has-many-through-relation –

答えて

3

のため申し訳ありません、あなたがしたい:次のようなものであるSQLで

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 

を。私は以下の略語を使用しました: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 
        ) 
     ) 
+0

うわー..これは私が正確に必要としたワットです。ありがとうございました......... – Nila

+1

+1「擬似SQL」について - 私はその方法を採用するかもしれません! –

関連する問題