トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-134 権限に応じた、データの出力

SQLパズル

UserTable
UserID
------
    A1
    B1
    B2
    C1
    C2
    C3

DataTable
KBN  Sq  name
---  --  ----------
  A   1  アリシア
  B   1  レイチェル
  B   2  ミレニア
  C   1  ベルトラン
  C   2  マイテ
  C   3  アージュ

UserTableのUserIDは、DataTableのKBN || SQ
となっていて、
以下の条件を参照条件として、
UserIDごとの参照可能なデータを出力する

条件1 UserTableのUserIDの、1文字目が、AまたはBなら、全レコードが参照可
条件2 条件1を満たさない場合は、自分のレコードのみ参照可
条件3 ただし、条件2には例外があり、Sqが1のユーザーは同じKBNのレコードをすべて参照可

出力結果
USERID  KBN  SQ  NAME
------  ---  --  ----------
    A1    A   1  アリシア
    A1    B   1  レイチェル
    A1    B   2  ミレニア
    A1    C   1  ベルトラン
    A1    C   2  マイテ
    A1    C   3  アージュ
    B1    A   1  アリシア
    B1    B   1  レイチェル
    B1    B   2  ミレニア
    B1    C   1  ベルトラン
    B1    C   2  マイテ
    B1    C   3  アージュ
    B2    A   1  アリシア
    B2    B   1  レイチェル
    B2    B   2  ミレニア
    B2    C   1  ベルトラン
    B2    C   2  マイテ
    B2    C   3  アージュ
    C1    C   1  ベルトラン
    C1    C   2  マイテ
    C1    C   3  アージュ
    C2    C   2  マイテ
    C3    C   3  アージュ


データ作成スクリプト

create table UserTable as
select 'A1' as UserID from dual
union select 'B1' from dual
union select 'B2' from dual
union select 'C1' from dual
union select 'C2' from dual
union select 'C3' from dual;

create table DataTable as
select 'A' as KBN,'1' as Sq,'アリシア' as name from dual
union select 'B','1','レイチェル' from dual
union select 'B','2','ミレニア' from dual
union select 'C','1','ベルトラン' from dual
union select 'C','2','マイテ' from dual
union select 'C','3','アージュ' from dual;


SQL

--■■■andとorを組み合わせる方法■■■
select a.UserID,b.KBN,b.Sq,b.name
  from UserTable a,DataTable b
 where substr(a.UserID,1,1) in('A','B')
    or (substr(a.UserID,2,1) = '1' and substr(a.UserID,1,1) = b.KBN)
    or a.UserID = b.KBN || b.Sq
order by a.UserID,b.KBN,b.Sq,b.name;

--■■■検索case式を使う方法■■■
select a.UserID,b.KBN,b.Sq,b.name
  from UserTable a,DataTable b
 where case when substr(a.UserID,1,1) in('A','B') then 1
            when substr(a.UserID,2,1) = '1' and substr(a.UserID,1,1) = b.KBN then 1
            when a.UserID = b.KBN || b.Sq then 1 else 0 end  = 1
order by a.UserID,b.KBN,b.Sq,b.name;


解説

0か1を返す、検索case式を使うと、
条件を分かりやすくできることがあります