🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Oracle

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

SQL

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

Q&A

解決済

2回答

7503閲覧

Oracleの階層問い合わせで計算値を子に引き継ぎたい

nemui_00

総合スコア5

Oracle

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

SQL

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

0グッド

0クリップ

投稿2019/12/19 06:58

編集2019/12/19 23:59

Oracleの階層問い合わせで、親の数量と親に対する数量を元に子の数量を順次計算していくことは可能でしょうか?
以下のようなテーブルで最上位の数量が変更された場合、子の数量を再計算したいです。

  • 更新前
ID親ID親に対する必要数数量
ID12
ID2ID124
ID3ID2312
ID4ID214
  • 更新後(ID1の数量を2→1に更新)
ID親ID親に対する必要数数量
ID11
ID2ID124
ID3ID2312
ID4ID214
  • 更新後テーブルから求めたい結果

親の数量*親に対する必要数で子の数量を再計算

ID親ID親に対する必要数数量(求めたい値)備考
ID11最上位
ID2ID1221(親数量)*2(親に対する必要数)
ID3ID2362(親数量)*3(親に対する必要数)
ID4ID2122(親数量)*1(親に対する必要数)

どなたかよい方法があればご教示お願い致します。
以下のSQLがやりたいことに近いのですが、最上位の子までしか計算できません。

sql

1SELECT DISTINCT 2 LEVEL 3 , ID 4 , ID_PARENT 5 , RT_PARENT 親に対する必要数 6 , VL_ITEM 数量 7 , (PRIOR VL_ITEM * RT_PARENT) 計算後数量 8FROM 9 TEST 10START WITH 11 ID = 'ID1' 12CONNECT BY 13 PRIOR ID = ID_PARENT; 14 15-- CREATE 16create table TEST ( 17 ID VARCHAR2(5) 18 , ID_PARENT VARCHAR2(5) 19 , VL_ITEM NUMBER(4,0) 20 , RT_PARENT NUMBER(4,0) 21 , constraint TEST_PKC primary key (ID) 22) ; 23 24comment on column TEST.ID is 'ID'; 25comment on column TEST.ID_PARENT is '親ID'; 26comment on column TEST.VL_ITEM is '数量'; 27comment on column TEST.RT_PARENT is '親に対する必要数'; 28 29-- INSERT 30insert into TEST(ID,ID_PARENT,VL_ITEM,RT_PARENT) values ('ID1',null,1,null); 31insert into TEST(ID,ID_PARENT,VL_ITEM,RT_PARENT) values ('ID2','ID1',4,2); 32insert into TEST(ID,ID_PARENT,VL_ITEM,RT_PARENT) values ('ID3','ID2',12,3); 33insert into TEST(ID,ID_PARENT,VL_ITEM,RT_PARENT) values ('ID4','ID2',4,1); 34

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

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

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

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

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

Orlofsky

2019/12/19 07:38

テーブル定義とデータは CREATE TABLEとINSERTに直した方が動作確認できるので、適切なコメントが付き易いです。
nemui_00

2019/12/19 07:56

ご指摘・アドバイスありがとうございます! 指摘いただいた内容で質問を修正しました。
sazi

2019/12/19 10:27

希望する結果を追記して下さい。
nemui_00

2019/12/19 23:53

ご指摘ありがとうございます。希望する結果を追記しました。
guest

回答2

0

ベストアンサー

階層を辿る必要があるので、階層問合せではできません。
再帰問合せを用います。
津島博士のパフォーマンス講座 第31回 再帰的問合せについて

手打ちで検証もしていませんが、イメージは以下の様な感じだと思います

SQL

1with tree(ID, ID_PARENT, VL_ITEM, RT_PARENT, lvl, clc_VL_ITEM) as ( 2 select ID, ID_PARENT, VL_ITEM, RT_PARENT 3 , 1, VL_ITEM 4 from TEST 5 where ID='ID1' 6union all 7 select t.ID, t.ID_PARENT, t.VL_ITEM, t.RT_PARENT 8 , tr.lvl+1, tr.clc_VL_ITEM * t.VL_ITEM 9 from TEST t inner join tree tr 10 on t.ID_PARENT=tr.ID 11) 12select * from tree

投稿2019/12/20 03:59

sazi

総合スコア25327

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

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

nemui_00

2019/12/20 04:39

回答いただいたSQLを参考にしたところ、うまくいきました。 大変勉強になりました。ありがとうございます。
guest

0

見ていてわかりにくいのでSQLをちょっと編集しました。

計算後数量 ってわからないので憶測で、質問に希望されるSELECT結果もあると良いですが、インラインビューを使えば良いってことでしょうか?

テーブル名、列名や別名に(今回の質問のように)1文字でもマルチバイト文字を使いたいときはダブルクォートで囲んでください。

SQL

1SQL> SELECT DISTINCT 2 2 LEVEL 3 3 , ID 4 4 , ID_PARENT 5 5 , RT_PARENT AS "親に対する必要数" 6 6 , VL_ITEM AS "数量" 7 7 , PRIOR CALC_ITEM AS "計算後数量" 8 8 FROM( 9 9 SELECT 10 10 ID 11 11 , ID_PARENT 12 12 , RT_PARENT 13 13 , VL_ITEM 14 14 , VL_ITEM * RT_PARENT AS CALC_ITEM 15 15 FROM TEST 16 16 ) 17 17 START WITH ID = 'ID1' 18 18 CONNECT BY PRIOR ID = ID_PARENT 19 19 ORDER BY 20 20 LEVEL 21 21 , ID 22 22 , ID_PARENT; 23 24 LEVEL ID ID_PARENT 親に対する必要数 数量 計算後数量 25---------- ---------- ---------- ---------------- ---------- ---------- 26 1 ID1 2 27 2 ID2 ID1 2 4 28 3 ID3 ID2 3 12 8 29 3 ID4 ID2 1 4 8 30 31SQL>

投稿2019/12/19 10:44

Orlofsky

総合スコア16417

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

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

nemui_00

2019/12/20 00:02

ご回答・アドバイスありがとうございます。説明不足で重ね重ね申し訳ありません。 更新後テーブルから求めたい結果を追加しましたので、ご確認いただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問