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

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

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

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

SQL

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

Q&A

解決済

4回答

3453閲覧

Oracle SQLで、最大LENGTH取得について。

abcmart

総合スコア7

Oracle

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

SQL

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

0グッド

0クリップ

投稿2020/05/13 04:38

編集2020/05/13 05:03

ORACEL SQLで、
セレクトした結果が、以下であるとします。

SELECT * FROM TBL;

<TBL> A列 B列 C列 A1 B1 CCC A2 B2 CCCCCC

このとき、C列の最大のLENGTH値を各レコードに新しい列(D列)として持たせた状態で、
セレクトした結果を以下のようにするSQLを教えていただけますでしょうか?

A1 B1 CCC 6
A2 B2 CCCCCC 6

SELECT A.*, (SELECT MAX(LENGTH(B.C列)) FROM TBL B) FROM TBL A;
とすると、うまくいくのはわかるのですが、
SELECT文自体が行数など長いため、サブクエリ(B)とすると、
処理時間が長くなってしまいます。
サブクエリ(B)を使用せずもっと簡単な記述で解決できる方法あれば
ご教授をお願いします。

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

分析関数(ウィンドウ関数)を使います。
詳しくはマニュアル等ご覧ください。

SQL

1SELECT 2 "A列" 3, "B列" 4, "C列" 5, MAX(LENGTH("C列")) OVER() MAX_LENGTH 6FROM 7 TBL

投稿2020/05/13 23:58

toyotaku

総合スコア103

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

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

sazi

2020/05/14 01:31

Maxを取るのは別なテーブルです
toyotaku

2020/05/14 01:41

質問内容からはそのようには読めませんが、誤りでしょうか?
sazi

2020/05/14 02:52

失礼しました。エイリアスとしているのを見落としていました。
abcmart

2020/05/21 06:37

toyotaku様 ご回答ありがとうございます! ご返信おそくなってしまいましたが、実は別のやり方で進めておりましたが、toyotaku様のSQLで実行したところ、当初のご質問の目的通りの結果を取得できること確認できました! ありがとうございます。
guest

0

CTEを使用して下さい。

SQL

1with B as ( 2 SELECT MAX(LENGTH(C列)) as c_max FROM TBL 3) 4SELECT A.*, c_max 5FROM TBL A, B

投稿2020/05/13 05:59

編集2020/05/14 02:56
sazi

総合スコア25327

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

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

abcmart

2020/05/13 07:49

TBLは何百行とあるそれなりに長い記述のSELECT結果のSQL文です。 TBLAとTBLBで、やはり同じものが最低でも2回記述しないといけないですかね?
sazi

2020/05/13 08:35 編集

元となるものは最低でも1回は記述しなければなりませんから、そうなりますね。 その部分をCTEで記述しておけば、同様の記述部分は簡略化されます。 またCTEの場合、結果はキャッシュとして使用されるので、性能にも寄与します。 最優先は性能だと思いますので、その上で記述が簡潔にできるかというのなら、質問を省略しすぎて 、その部分が伝わってない気がします。 そもそも、同じ結果が出力されるものを、selectでのサブクエリーにしても遅くないと思いますので、実行計画も質問に追記された方が良いかもしれません。 そのサブクエリーが相関サブクエリーであるなら、from句にインラインビューとして記述し結合させると、性能問題は解決すると思います。
guest

0

MAX, MIN, AVG, COUNT などをグループ関数と言います。

SQL

1SELECT 2 MAX(COLUMN_NAME1) AS MAX_COLUMN_NAME1 3FROM TABLE_NAME1 ; 4はテーブル TABLE_NAME1 全体の COLUMN_NAME1 から最大値のものを取得します。 5 6SELECT 7 MAX(LENGTH(COLUMN_NAME1)) AS MAX_LENGTH_COLUMN_NAME1 8FROM TABLE_NAME1 ; 9はテーブル TABLE_NAME1 全体の COLUMN_NAME1 のLENGTH の最大値のものを取得します。 10 11SELECT 12 COLUMN_NAME_A 13 , COLUMN_NAME_B 14 , MAX(LENGTH(COLUMN_NAME1)) AS MAX_LENGTH_COLUMN_NAME1 15FROM TABLE_NAME1 16ORDER BY 17 COLUMN_NAME_A, COLUMN_NAME_B ; 18はテーブル TABLE_NAME1 の同じ値の COLUMN_NAME_A, COLUMN_NAME_B 毎に COLUMN_NAME1 のLENGTH の最大値のものを取得します。

質問のエラーはORDER BY句が抜けていたからです。

投稿2020/05/13 05:54

Orlofsky

総合スコア16417

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

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

abcmart

2020/05/13 07:45

ORDER BY ? ちなみに毎ではありません。 質問にもあるように、max値を一律各レコードに持たせた状態でセレクトしたいのです。
Orlofsky

2020/05/13 09:31

用途が思い浮かばないです。 SELECTをカタカナで書くのは止めてね。
guest

0

目的がイマイチ分からないのですが、
この場合だと

SQL

1SELECT 2 TBL.*, 3 TBL2.C_MAX 4FROM 5 TBL, 6 (SELECT MAX(LENGTH(C列)) AS C_MAX 7 FROM TBL) TBL2

とかですかね。
(SQL実行してないので間違えてたらごめんなさい)

SELECT句にサブクエリを書くと、1レコードに対して何度も同じSQLを投げてしまいます。
だから処理時間が長いんですね。

蛇足:
個人的にはこういうSQLは好みません。
TBLとTBL2とをつなぐ条件がまったくないので、レコード数が増えると重くなります。
別々でSQLを発行して、SQLを呼び出しているプログラムでくっつけて出力した方が断然早くなるし効率的です。

投稿2020/05/13 05:14

編集2020/05/13 05:20
kaputaros

総合スコア1844

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

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

abcmart

2020/05/13 05:36

ありがとうございます。 TBLは、あるテーブルを指してる記述になっておりますが、実際には何百行と記述されたそれなりに行数のあるSELECT結果です。 いただいた回答のTBLに上記何百行のセレクト結果を書く場合、全体的に記述が長く(FROM句に2つ書くことに)なり、処理時間も増えるイメージですが、これは仕方ないのでしょうか?
kaputaros

2020/05/14 00:54

from句に書くなら1回の評価で済むので、select句で1レコードずつ評価されるのより短縮されるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問