一度のSQL発行で結果を得るにはどのようなSQLにすれば良いでしょうか?
データベースはOracleです。
二つの履歴テーブルがあり、それぞれ主キーは「連番」です。
連番が最も大きい値の社員番号と社員名を取得しようとしています。
(他にもカラムはありますが質問では省略しています。)
連番は別に管理テーブルがあり、そちらから採番しているので
二つのテーブルで連番が重複することはありません。
【RIREKI_TBL_A】
連番 NUMBER(10)
社員番号 VARCHAR(7)
社員名 NVARCHAR(20)
【RIREKI_TBL_B】
連番 NUMBER(10)
社員番号 VARCHAR(7)
社員名 NVARCHAR(20)
No.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の最大で大きい方ということですよね
両方の最大ならもっと簡単ですし。
ご回答ありがとうございます。
私の質問に「社員ごとの最新の連番データを取得したい」という一言が不足しておりました。
申し訳ないです。
ご回答いただいたSQLを実行したところ「as ta」のasが不要でしたが
このSQLをヒントにSQLを作成することができました。
No.1
- 回答日時:
どのような頻度で履歴が追加されているのかが分かりませんが、履歴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で返るでしょう。
ご回答ありがとうございます。
私の説明が説明が不足しており申し訳ありません。
社員ごとに最新の連番のデータを取得したかったので
管理テーブルの連番=であるとうまく取得することが出来ませんでした。
ロックをかける点についての指摘ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
10営業日前の日付を取得したい...
-
DLookupの設定で・・・
-
沿線コード
-
SQLの集計について教えてくださ...
-
【SQL】登録されているかを比較...
-
Order by句でバインド変数を使...
-
Excelファイルのデータをテーブ...
-
select insertで複数テーブルか...
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
外部結合とor条件混在の記述方法
-
ワードの差込印刷で教えて下さ...
-
カレントレコードが無い事を判...
-
OracleのSQL*PLUSで、デー...
-
Accessのクエリでフィールドの...
-
ヘッダレコードとトレーラレコ...
-
ファイル書込みで一行もしくは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
CREATE テーブルでの複数外部...
-
Order by句でバインド変数を使...
-
沿線コード
-
平成20年 春期 基本情報技術者 ...
-
10営業日前の日付を取得したい...
-
SQLについて
-
困っています。ORACLE_SQL 複数...
-
SQLServer 日付が直前のレコー...
-
SQL文の書き方
-
複数テーブル間の集計
-
【SQL】またぎデータの検索の仕方
-
SQLで<>を使用するとき、
-
Excelファイルのデータをテーブ...
-
Access2000での複合検索再び
-
Oracle 文字コードについて
-
Oracleビュー:同じ意味で異な...
-
一度のSQL発行で結果を得るには...
-
SQLの題材
-
PLSQLは実際にどんな処理をする...
おすすめ情報