一度の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で質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle Oracleですがsqlで質問です。 サブクエリ内で番号というカラムで昇順の1レコード目を取得したい 3 2023/05/22 10:02
- PostgreSQL postgreSQL カラムの全ての値を取得したい 3 2022/10/07 12:33
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLServer 日付が直前のレコー...
-
平成20年 春期 基本情報技術者 ...
-
Access終了時の最適化が失敗?
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
Accessで別テーブルの値をフォ...
-
カレントレコードが無い事を判...
-
ファイル書込みで一行もしくは...
-
SQL文で右から1文字だけ削除す...
-
【MYSQL】asでリネームしてwher...
-
SELECTで1件のみ取得するには?
-
MERGE文を単体テーブルに対して...
-
Access 文字+年ごとの自動採番
-
[VBA] ADOの Clone と AddNew
-
SQLの書き方(チェックボックス)
-
access 自動採番 年が変わる...
-
実績累計の求め方と意味を教え...
-
select句副問い合わせ 値の個...
-
SQLについて質問です。 AVG関数...
-
sum()の出力結果順に並び替えを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
CREATE テーブルでの複数外部...
-
沿線コード
-
10営業日前の日付を取得したい...
-
Order by句でバインド変数を使...
-
ヤマト急便のチェックデジット...
-
同一コード毎に最新の名称を取...
-
SQLに関して
-
【SQL】登録されているかを比較...
-
SELECT文で
-
オラクル 名称をコードに変換
-
SQLの抽出条件の記述の仕方につ...
-
一度のSQL発行で結果を得るには...
-
ACCESSで、コード基本のお勧め...
-
SQLにて縦を横へ展開
-
SQLの集約の方法
-
SQLで<>を使用するとき、
-
基本情報技術者の試験について
-
ストアドプロシージャーの引数...
-
SQL GROUP BY
おすすめ情報