- ベストアンサー
一度のSQL発行で結果を得る方法
- データベースはOracleで、二つの履歴テーブルから連番が最も大きい値の社員番号と社員名を取得するSQLについての質問です。
- 連番は別に管理テーブルがあり、重複はないとのことです。
- 質問の要点は一度のSQL発行で結果を得る方法についてです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
select 連番,社員番号,社員名 from (select 連番,社員番号,社員名 from RIREKI_TBL_A union all select 連番,社員番号,社員名 from RIREKI_TBL_B) as ta where ta.連番 in (select MAX(連番) from(select 連番 from RIREKI_TBL_A union all select 連番 from RIREKI_TBL_B) ) ですかね。。 試してませんが。 AとBの最大で大きい方ということですよね 両方の最大ならもっと簡単ですし。
その他の回答 (1)
- NNori
- ベストアンサー率22% (377/1669)
どのような頻度で履歴が追加されているのかが分かりませんが、履歴Aと履歴Bを同時に読んで最大の方をとりたい、ということであれば、 ・今やろうとしているSQL文を実行している間はテーブルごとロックする ことが必要だと思います。 だとすると、1回のSQL文で実行したくなるのは理解できます。でもそうやって取ってきた社員番号と社員名は、ロックを外した次の瞬間にすでに新しい履歴を放り込まれちゃっている可能性があります。 つまり、本当にまじめにやりたいなら、このSQL文を使って取り出した社員番号と社員名を使う処理が終わるまでは履歴テーブルに書き込みを行ってはいけない、ということになります。 まぁ要は厳密にやろうとすると履歴テーブルをかなりの長い時間ロックしなくてはいけないので実用上問題があるということです。 言い換えると厳密にはできないということです。厳密でなくて良いならば、「管理テーブル」から今の時点での連番の最大値を取得して、それを使って履歴テーブルから社員番号と社員名を取り出すほうがよほど速いと思いますよ。(簡単だし) select RIREKI_TBL_A.社員番号,RIREKI_TBL_A.社員名,RIREKI_TBL_B.社員番号,RIREKI_TBL_B.社員名 from RIREKI_TBL_A,RIREKI_TBL_B,管理テーブル where RIREKI_TBL_A.連番 = 連番.管理テーブル and RIREKI_TBL_B.連番 = 管理テーブル.連番; おそらくWhere の後ろの条件式は、どちらかしか成り立たないので、取り出したフィールドのどちらかはNULLで返るでしょう。
お礼
ご回答ありがとうございます。 私の説明が説明が不足しており申し訳ありません。 社員ごとに最新の連番のデータを取得したかったので 管理テーブルの連番=であるとうまく取得することが出来ませんでした。 ロックをかける点についての指摘ありがとうございました。
お礼
ご回答ありがとうございます。 私の質問に「社員ごとの最新の連番データを取得したい」という一言が不足しておりました。 申し訳ないです。 ご回答いただいたSQLを実行したところ「as ta」のasが不要でしたが このSQLをヒントにSQLを作成することができました。