質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

6592閲覧

副問合せの場所(select句でやるか、from句でやるか)

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/12/05 06:35

知りたいこと・背景

hogeテーブルの各データ+最終アクセス時間を取得するSQLの書き方で迷っています。

下記のサンプルコードで
②のSQLだと、一度テーブル全体でgroup by するので少しパフォーマンスが悪いのかなと思っています。
②でもidで抽出した結果をgroup by するような記載に変えることができるでしょうか?

他の仕様と設計書との兼ね合いで、②のほうが表現しやすく、②の書き方で統一したいのですが・・・

サンプルコード

t_hogeテーブル

idnameaddress
1fizz東京・・・
1buzz神奈川・・・

t_acessテーブル

idaccess_date
12019/12/05 14:00:00
12019/12/05 14:10:00
22019/12/05 15:11:00

①SELECTで副問合せするSQL

SQL

1select 2 t_hoge.* 3 ,(select max(access_date) from t_access where id = t_hoge.id) last_access 4from t_hoge

②FROMで副問合せするSQL

SQL

1select 2 t_hoge.* 3 ,acc.last_access 4from t_hoge 5left join ( 6 select id, max(access_date) last_access from t_access group by id 7 ) acc on acc.id = t_hoge.id

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Oracle EXPLAIN PLAN を使って実行計画を取得する したり、実際にデータを用意して処理時間を実測します。

そのために、CREATE TABLEやデータを何件かでも INSERTで提示できると、SELECT文を実行して動作確認できるので適切なコメントが付き易いです。

投稿2019/12/05 07:00

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/12/05 10:10

サンプル程度のデータだと、統計情報の内容が違い過ぎるし、CREATE TABLE等は実行計画の結果とセットですね。
Orlofsky

2019/12/05 10:35

だから、 [データを何件かでも] と心苦しい心情を吐露している訳です。 副問合せを多用しなければけいないのって、テーブル設計がかなりヤバいことが多いです。テーブル設計から呼んでもらえたら何千万円も節約できたのに、ってため息。
sazi

2019/12/05 12:01

幾ばくかのデータより、実行計画の結果が良いって話です。
Orlofsky

2019/12/05 12:05

オラクル・コンサルタントの仕事を手伝った事がありますが、彼らは実行計画も見るけど本番並みのデータを用意して処理時間を実測することを重視していました。
guest

0

②のSQLだと、一度テーブル全体でgroup by するので少しパフォーマンスが悪いのかなと思っています。

実環境が無いところで論ずることはできません。
実行計画で確認して下さい。(実行計画についてはご自身で検索などされて下さい)

②でもidで抽出した結果をgroup by するような記載に変えることができるでしょうか?

出来ますけど、oracleではt_hogeの項目全てを列挙しなければなりません。
group by しているのは、last_accessを取り出す為だけであって、t_hogeをgroup byする要件はありませんから、書き方の為だけに行うのは効率的ではありませんね。

投稿2019/12/05 06:49

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問