・データベース Oracle10g
・プログラム java 1.6
お世話になっております。業務でOracleを利用して以下のデータをしたいと考えています。
★やりたいこと
・検索画面から、状態を指定し、次画面の検索結果画面で結果を表示したい。
・検索条件は、状態のみ(本当はいろいろあるけどここでは割愛)
・ログイン時のユーザー情報を保持しており、画面で指定された'状態’と'ユーザー'をキーにデータを取得する
・係長、一般職、派遣のユーザーは "状態"が"本社承認済み"以降のデータしか見られない
・ただし、自分が登録・申請・承認に関わるデータは"本社承認済み"以前の状態のものも見られる
・上記の結果を一回のSQLで取得したい
■テーブル:予定情報
---------------------------------------------
登録内容 | 登録者 | 申請者 | 承認者 | 状態・・・・
---------------------------------------------
AAAAAAAA |派遣 | 課長 | 部長 | 登録済み
BBBBBBBB |一般職 | 係長 | 申請済み
CCCCCCCC |派遣 | 一般職 | 課長 | 本社承認済み
DDDDDDDD |課長 | 課長 | 部長 | 連携済み
EEEEEEEE |派遣 | 派遣 | 係長 | 反映済み
※ユーザーが一般職の場合、登録内容AAAAAAAA以外のデータを取得する
派遣の場合は、登録内容BBBBBBBB以外のデータを取得する
係長の場合は、登録内容AAAAAAAA以外のデータを取得する
■ユーザー(登録者、申請者、承認者のデータ)
以下のユーザーが存在しています。
・社長
・部長
・課長
・係長
・一般職
・派遣
■画面から指定可能な状態は以下の通り
・すべて
・登録済み
・申請済み
・本社承認済み
・連携済み
・反映済み
★わからないこと
検索画面で状態'すべて'が選択された場合に、
係長、一般職、派遣のユーザーについて状態"が"本社承認済み"以降のデータはすべて表示し、
自分が登録・申請・承認に関わるデータは"本社承認済み"以前の状態のものを取得するというSQL
の条件指定をおこない際の構文がわからない。
状態が'登録済み'かつ、ユーザーが'派遣'の場合のSQLは以下ですが、
状態で'すべて'が選択された場合は、どのような構文になるのでしょうか?
Selct * from 予定情報 where 状態 ='登録済み'
and 登録者 = '派遣' and 申請者 = '派遣' and 承認者 ='派遣'
なにとぞよろしくお願いいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こういった場合、以下のようなマスタ類を整備します。
■状態マスタ
状態コード、状態
・10:登録済み
・20:申請済み
・30:本社承認済み
・40:連携済み
・50:反映済み
"本社承認済み"以前は、「where 状態コード > 30」で表現可能です。
※というか、以前以後を表現するためには「本社承認済み」という文字列では表現できません。
また、ユーザに対しては参照可能な「状態コード」を付与します。
こうすることで、ユーザが参照可能な状態を定義します。
■ユーザマスタ
ユーザID、参照可能状態コード、ユーザ名
・01 10 社長
・02 10 部長
・03 10 課長
・04 40 係長
・05 40 一般職
・06 40 派遣
こうしておけば以下条件で各ユーザが参照可能な状態を指定できます。
ユーザ毎に個別指定も可能です。
「where 状態コード >= 参照可能状態コード」
一般職は40からしか見られなくなりますし、課長は10から見られます。
■状態マスタ
・99 すべて
・10 登録済み
・20 申請済み
・30 本社承認済み
・40 連携済み
・50 反映済み
(1) 検索条件取得
「一般職」が状態「登録済み」を指定。
・ユーザID(05)と参照可能状態コード(40)を取得
・指定された状態(10)を取得
(2)SQLの組み立て
(1)で取得した条件を以下に当てはめていきます。
カッコで条件の優先順位を定義します。
条件は(a)、(b)、(c)に分けます。
(a) 自己データの検索部分
(b)ユーザ権限による検索部分
(c)指定された状態を権限に付与する。
優先順位は以下にします。
ただし、(c)の条件は99の場合は指定しません。
( (a) or (b) ) and (c)
以下のようなSQLとなります。
--(a) 自己データの検索部分
-- 登録者、申請者 、承認者が自分 の場合は、状態を検索条件にしない。
where
(
(
(登録者コード = 05 or 申請者コード = 05 or 承認者コード = 05 )
)
-- (b)ユーザ権限による検索部分
-- 参照可能な状態を指定する。
or ( where 状態コード >= 40)
)
-- (c)指定された状態を権限に付与する。
-- ※99の場合は条件指定を省略
and 状態コード = 10
--
これくらいのテーブル構成でないと、実現はできないと思います。
じゃないと、java内部で条件指定を直書きすることになります。
あと、これだと(and条件)、登録も申請も承認も「派遣」の人が全部やったデータしかみられませんよ?
>Select * from 予定情報 where 状態 ='登録済み'
>and 登録者 = '派遣' and 申請者 = '派遣' and 承認者 ='派遣'
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MS-Accessのエクスポートで異常...
-
ACCESSのデータをWebブラウザで...
-
警察はスマホに保存した動画や...
-
SQL*Loaderのコミットポイント...
-
復旧中のデータベースについて
-
PostgreSQLのDB復元
-
【DB】同じトランザクション内...
-
エクセルのフィルタ抽出が固まる
-
「パッシブシャットダウン」っ...
-
DATファイルをEXCELで開きたい
-
postgresql についてです
-
復元に異常に時間がかかる
-
32ビット版Officeで作成64ビッ...
-
新聞サイズの大きさのPDF化...
-
データベース復元時に指定する...
-
ADO Connection を再利用する方法
-
SQL Server Management Studio ...
-
復元を取り消したい
-
ファイルメーカー(FileMaker)...
-
携帯電話 データ復旧について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのデータをWebブラウザで...
-
MS-Accessのエクスポートで異常...
-
Sqliteで使えない文字。
-
1回目の実行に3分、2回目の実行...
-
会社の諸事情により全システム...
-
ACCESS2010 Excelエクスポート ...
-
accessの上限容量2Gでは容量が...
-
oracleデータベースの更新履歴
-
SQLServerのDBのうちテーブルを...
-
データベース
-
過去データに対するデータベー...
-
ACOSのRDBについて教え...
-
SQL ServerにExcelをリンクさせ...
-
ASPでwebショップをプログラムする
-
SQL文で、重複データの上書きは...
-
別サーバーへのデータの同期更...
-
[AC2000]SQLで追加若しくは更新...
-
オンメモリデータベースとは?
-
ツリー情報のデータをSQLで取得...
-
テストデータの作成
おすすめ情報