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

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

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

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

Q&A

解決済

1回答

214閲覧

SQLSERVER 2013を使い階層テーブルの再帰ツリーを表示しようとしているのですが上手くいきません。

pentagon

総合スコア11

SQL

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

1グッド

0クリップ

投稿2023/10/13 23:00

実現したいこと

ここに実現したいことを箇条書きで書いてください。

SQLSERVER 2013を使い階層テーブルの再帰ツリーを表示
リンク内容イメージ説明

発生している問題・エラーメッセージ

取得内容がおかしい

該当のソースコード

SQLSERVER

1 2 3with R as ( 4 select MASTER,CHILD,SEQ,1 as LVL from CSM070STRC CS070 5 where MASTER = 'test01' 6 union all 7 select C.MASTER,C.CHILD,C.SEQ, LVL+1 as RR 8 from CSM070STRC as C JOIN R ON C.MASTER = R.CHILD 9 ) 10SELECT * FROM R ORDER BY SEQ 11

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

29507-01👍を押しています

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

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

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

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

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

neko_the_shadow

2023/10/13 23:43

①CSM070STRCのテーブル定義 ②CSM070STRCのサンプルデータ ③求める結果 可能な範囲でよいので、↑をそれぞれ提示いただけますか? また問題になっているのは並び順が正しくないという認識でよいですか? ・現状…SEQの昇順 ・求める結果…ツリーを深さ優先探索でたどっていった結果を表示したい
29507-01

2023/10/14 01:51

① master,child,ksu ➁ サンプルデータは添付画像の左側 test01,8387 8387,8388 8387,A0752 test01,8426 下は割愛します ③ 添付左の画像 行 --- seq順 LVL---階層 CODE データ上のchild
29507-01

2023/10/14 01:57

添付左の画像が欲しい結果です。方法は構成マスターを順に読み込んで処理しているので そうではなく,画像右側のsqを使ったの再帰ツリー方法でやりたいのです
neko_the_shadow

2023/10/14 03:28

A. 質問者の方とIDが違うようですが、同一の方が回答されている認識でよいですか? B. 「➁ サンプルデータは添付画像の左側」とありますが、これは「右側」が正しいという認識でよいですか? C. 「行 --- seq順」とありますが、提示していただいたテーブル定義「master,child,ksu」にはないようです。テーブル定義にはカラムseqもあって、添付画像右側と同じデータが入っているという認識でよいですか?
neko_the_shadow

2023/10/14 03:28

やりたいことがうまく整理できていない印象を受けます。以下のようなデータがCSM070STRCにあるとします。 ・(master, chid, seq) = (test01, 8387, 1) → (8387, 8388, 2) ・(master, chid, seq) = (test01, 8426, 2) → (8426, 5049, 3) / (8426, 5050, 8) これを次のように表示したいという認識でよいですか? (行, lvl, code) (1, 1, 8387) ← 親CODEが8387 (2, 2, 8388) ← 親CODEが8387 (3, 1, 8426) ← 親CODEが8426 (4, 2, 5049) ← 親CODEが8426。LVLが同じならseqの昇順 (5, 2, 5050) ← 親CODEが8426。LVLが同じならseqの昇順
29507-01

2023/10/14 04:05

A.質問者です B.左の画像が表示したい結果です。右の画像はSQLで実行したダメな結果です SEQは読み込んだ順番です。データにはありません (master,child) test01,8387 8387,8388 8387,A0752 test01,8389 test01,8392 8392,8393 8392,A0752 これを SEQ LVL CODE 1 1 8387   LVL はtest01の下の階層 2 2 8388  LVL は8387の下の階層 3 2 A0752  LVL は8387の下の階層 4 1 8389 LVL はtest01の下の階層 5 1 8392 LVL はtest01の下の階層 6 2 8393   LVL は8392の下の階層 7 2 A0752 LVL は8392の下の階層 としたいのです
29507-01

2023/10/14 07:45

neko_tha_shadow様 2023/10/14 12:28の認識で間違いないです。 lvlは親の直下だと1 その下の階層だと2 seqはデータ上持っていなくて展開した順に行としてセットします
pentagon

2023/10/14 20:01

有難うございます。 shadow様 結果上手くいったのですが表示順だけをtest01直下のseq順にならないでしょうか? 申し訳ございません。 seqはデータに持っていないと言っていたのですが 持っていました。 shadowさんのデータの内容で ・(master, chid, seq) = (test01, 8387, 1) → (8387, 8388, 1) ・(master, chid, seq) = (test01, 8426, 2) → (8426, 5049, 1) / (8426, 5050, 2) ・(master, chid, seq) = (test01, 8392, 3) → (8392, 8393, 1) / (8392, A0752, 2) test01直下のseq順に出力出来ないでしょうか? 8387   8388 A0752 8426 5049 5050   8392 8393 A052
pentagon

2023/10/14 20:24

shadow様 すみません 結果のデータでさらに直下のseq順に表示するのは可能なのでしょうか? (直下でないseqは無視 - - - 書かれているseq自体がおかしい為)
guest

回答1

0

ベストアンサー

質問の意図を十分に汲み取れているか心配ですが…。まずテーブル定義とサンプルデータは以下の通りです。

SQL

1CREATE TABLE CSM070STRC (master VARCHAR(6), child VARCHAR(6)); 2INSERT INTO CSM070STRC VALUES ('test01', '8387' ); 3INSERT INTO CSM070STRC VALUES ('8387' , '8388' ); 4INSERT INTO CSM070STRC VALUES ('8387' , 'A0752'); 5INSERT INTO CSM070STRC VALUES ('test01', '8426' ); 6INSERT INTO CSM070STRC VALUES ('8426' , '5049' ); 7INSERT INTO CSM070STRC VALUES ('8426' , '5050' ); 8INSERT INTO CSM070STRC VALUES ('8426' , '4132' ); 9INSERT INTO CSM070STRC VALUES ('8426' , '1271' ); 10INSERT INTO CSM070STRC VALUES ('8426' , '4248' ); 11INSERT INTO CSM070STRC VALUES ('test01', '8392' ); 12INSERT INTO CSM070STRC VALUES ('8392' , '8393' ); 13INSERT INTO CSM070STRC VALUES ('8392' , 'A0752');

次のようなSQLで求める結果を得られると思います。

SQL

1WITH R (root, code, lvl) AS ( 2 SELECT child, child, 1 FROM CSM070STRC WHERE master = 'test01' 3 UNION ALL 4 SELECT root, C.child, lvl+1 5 FROM R 6 JOIN CSM070STRC C ON R.code = C.master 7) 8SELECT ROW_NUMBER() OVER (ORDER BY root, lvl, code) seq, lvl, code 9FROM R 10ORDER BY seq

2023-10-05 20:05追記

表示順だけをtest01直下のseq順にならないでしょうか? 申し訳ございません。

seqはデータに持っていないと言っていたのですが 持っていました。

テーブル定義とサンプルデータは次のようになっていたということですかね?

SQL

1CREATE TABLE CSM070STRC (master VARCHAR(6), child VARCHAR(6), seq INT); 2INSERT INTO CSM070STRC VALUES ('test01', '8387' , 1 ); 3INSERT INTO CSM070STRC VALUES ('8387' , '8388' , 2 ); 4INSERT INTO CSM070STRC VALUES ('8387' , 'A0752', 2 ); 5INSERT INTO CSM070STRC VALUES ('test01', '8426' , 2 ); 6INSERT INTO CSM070STRC VALUES ('8426' , '5049' , 7 ); 7INSERT INTO CSM070STRC VALUES ('8426' , '5050' , 8 ); 8INSERT INTO CSM070STRC VALUES ('8426' , '4132' , 9 ); 9INSERT INTO CSM070STRC VALUES ('8426' , '1271' , 10); 10INSERT INTO CSM070STRC VALUES ('8426' , '4248' , 11); 11INSERT INTO CSM070STRC VALUES ('test01', '8392' , 3 ); 12INSERT INTO CSM070STRC VALUES ('8392' , '8393' , 6 ); 13INSERT INTO CSM070STRC VALUES ('8392' , 'A0752', 7 );

必要な結果を求めるSQLは以下の様になると思います。

SQL

1WITH R (root_seq, code, seq, lvl) AS ( 2 SELECT seq, child, seq, 1 FROM CSM070STRC WHERE master = 'test01' 3 UNION ALL 4 SELECT R.root_seq, C.child, C.seq, R.lvl+1 5 FROM R 6 JOIN CSM070STRC C ON R.code = C.master 7) 8SELECT ROW_NUMBER() OVER (ORDER BY root_seq, lvl, seq), lvl, code 9FROM R 10ORDER BY

投稿2023/10/14 11:33

編集2023/10/15 11:08
neko_the_shadow

総合スコア2273

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

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

pentagon

2023/10/14 20:26

有難うございます。 shadow様 結果上手くいったのですが表示順だけをtest01直下のseq順にならないでしょうか? 申し訳ございません。 seqはデータに持っていないと言っていたのですが 持っていました。 shadowさんのデータの内容で ・(master, chid, seq) = (test01, 8387, 1) → (8387, 8388, 1) ・(master, chid, seq) = (test01, 8426, 2) → (8426, 5049, 1) / (8426, 5050, 2) ・(master, chid, seq) = (test01, 8392, 3) → (8392, 8393, 1) / (8392, A0752, 2) test01直下のseq順に出力出来ないでしょうか? 8387   8388 A0752 8426 5049 5050   8392 8393 A052 結果のデータでさらに直下のseq順に表示するのは可能なのでしょうか? (直下でないseqは無視 - - - 書かれているseq自体がおかしい為)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問