dポイントプレゼントキャンペーン実施中!

一度のSQL発行で結果を得るにはどのようなSQLにすれば良いでしょうか?
データベースはOracleです。
二つの履歴テーブルがあり、それぞれ主キーは「連番」です。
連番が最も大きい値の社員番号と社員名を取得しようとしています。
(他にもカラムはありますが質問では省略しています。)
連番は別に管理テーブルがあり、そちらから採番しているので
二つのテーブルで連番が重複することはありません。

【RIREKI_TBL_A】
連番 NUMBER(10)
社員番号 VARCHAR(7)
社員名 NVARCHAR(20)

【RIREKI_TBL_B】
連番 NUMBER(10)
社員番号 VARCHAR(7)
社員名 NVARCHAR(20)

A 回答 (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の最大で大きい方ということですよね
両方の最大ならもっと簡単ですし。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私の質問に「社員ごとの最新の連番データを取得したい」という一言が不足しておりました。
申し訳ないです。

ご回答いただいたSQLを実行したところ「as ta」のasが不要でしたが
このSQLをヒントにSQLを作成することができました。

お礼日時:2010/05/21 22:50

どのような頻度で履歴が追加されているのかが分かりませんが、履歴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で返るでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私の説明が説明が不足しており申し訳ありません。
社員ごとに最新の連番のデータを取得したかったので
管理テーブルの連番=であるとうまく取得することが出来ませんでした。

ロックをかける点についての指摘ありがとうございました。

お礼日時:2010/05/21 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す