SQLで階層(ツリー)情報を取得する方法・アドバイス

このQ&Aのポイント
  • SQLを使用して階層(ツリー)情報を取得する方法やアドバイスをお教えください。
  • 添付画像のテーブルイメージを元に、階層構造の情報を取得したいです。PostgreSQLでの動作を前提とし、SQLを使って解決したいです。
  • クエリの発行数をなるべく1回にしたいですが、必要に応じて2回以上のクエリも使用できます。また、アプリケーション側でのループ処理は避け、一時テーブルの作成も可能です。
回答を見る
  • ベストアンサー

SQLで階層(ツリー)情報を取得

また質問させて頂きます。宜しくお願いします。 現在添付画像のテーブルイメージのように情報を取得したいのですが、 方法が思い浮かず投稿させていただいています。 取得したい階層のイメージは、添付画像ツリーイメージのようになる事を求めています。 要望としては、 ・PostgresSQL8.4で動作可能 ・なるべくSQLで解決したい ・SQLのクエリ発行数に関してはなるべく1回が良いですが別に2回以上でも使用可 (ただし、アプリケーション側でループ処理とかは無し。1000回ループとかありえるんで。。。) ・必要ならば一時テーブルの作成もあり お手数ですが、どなたか方法・アドバイス等お教え頂ければ助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

PostgreSQLの環境がないので試すことができないのですが、 connectby()関数を使ってみてはどうでしょうか。 「PostgreSQL 階層問合せ」などで検索してみるといいと思います。 参考になれば幸いです。

miyahiro0730
質問者

補足

せっかくご回答して頂いたのに、お礼が遅くなって大変申し訳ございません。 上記回答して頂いた内容を調べてみました。 現在Ver8.4では「WITH RECURSIVE」という処理でわかりやすい文法になってるようですね。 こういう処理自体はじめて知りました。 尚、現状ですがツリーイメージにあります、リーフ(末端)からルート(最上位)までの階層を取得する処理は以下のSQL文で解決しましたが、全てのリーフ(末端)を取得するようなSQLはできませんでした。(もう少しでできそうだったんですが…) ループで回すしか無いですかね… --現状のSQL------------------------------------------------------ WITH RECURSIVE rec(階層ID, 階層名, 親階層ID, 末端階層ID) as ( SELECT 階層ID, 階層名, 親階層ID, '03' AS 末端階層ID ← '03'は末端階層ID(とりあえず末端の'03'を使用) FROM 階層管理テーブル WHERE 階層ID = '03' UNION ALL SELECT A.階層ID, A.階層名, A.親階層ID, '03' AS 末端階層ID ← '03'は末端階層ID(とりあえず末端の'03'を使用) FROM 階層管理テーブル A INNER JOIN rec ON A.階層ID = rec.親階層ID ) SELECT * FROM rec ORDER BY 親階層ID, 階層ID -------------------------------------------------------------------

関連するQ&A

  • PostgresSQL8.4でツリー上に取得したい

    PostgresSQL8.4でツリー上に取得したい こんにちわ。 PostgresSQLでツリー上にデータを取得したいのですが、思ったように取得できないのでご教授をお願いします画像の「取得したい順番」。 データはid,name,parentとの構造になっています。 データは親子構造になっており、親の下に子が並ぶようにしたいんです。 子は親のidをparentに持っています。 元のデータは画像の「元データ」になっています。 現状再起SQLでデータを取得しid or parentでソートを掛けているのですが、意図した通りに取得できません画像の「取得出来る順番」。 そもそも再起SQLでできるのか、相関サブクエリを使うのか・・・SQLのみでできるのかすら分からなくなってきました・・・。 何か画像の「取得したい順番」通りに取得する方法はないでしょうか。 ヒントだけでもいいので、ご教授をお願いします。

  • SQLで取得可能でしょうか

    SQLで取得可能でしょうか 今2つのテーブルがあるとします。 ---------------------- テーブル1  KEY    項目   1   テスト1   2   テスト2   3   テスト3 ----------------------- ---------------------- テーブル2   CD  名称    1   か   1   き   2   さ   2   し   2   す   3   た ----------------------- テーブル1のKEYはキーで重複しません。 テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。 今、テーブル1のKEY1件につき、データを1件取得したいのですが、 テーブル2の名称も取得したいです。 データは1件しか取得しない為、名称は、特定文字(例として/)で 区切って取得したいです。 期待したい結果 ----------------------  KEY  名称   1  か/き   2  さ/し/す   3  た ---------------------- このような取得は可能でしょうか? 尚、SQLの発行は1回のみで行いたいです。 よろしくお願いします。

  • SQLサーバーについて

    アクセスユーザーです。 データベースを操作するならアクセスよりSQLサーバーの方が良いと聞いたのですが SQLサーバーのイメージがいまいちわかりません。 アクセスは、 ・テーブル ・クエリ ・フォーム ・レポート ・マクロ ・VBA がありますが、 SQLサーバーは、テーブルとクエリしかなくて、 テーブルの置き場として使うソフト。と言う認識であってますか?

  • SQLサーバから、項目の属性(型)を取得したいのですが・・・

    SQLサーバからテーブルの項目名、属性(型)を取得するには、どのように クエリを組めば良いのでしょうか?

  • 2つの情報を1つのSQLで取得する方法について

    お世話になります。 SQL文で、下記内容のデータを取得する方法がわかりません。 ・TESTテーブルからA、B、Cの3項目のデータを取得する。 ・但し、この中のC項目については、WHERE句の条件を満たす データの最大値を取得する。 ・項目AおよびBの取得条件は、項目Cと同一条件とする。 ・目的は、項目AおよびBに関しては、WHERE句の条件を満たす  全てのレコードを取得し、項目Cにおいては最大値のみ取得したい。 上記内容を取得しようと考えた場合、 現時点で下記のSQL文を作成して実行しましたが、 うまくデータが取得できません。 SELECT A, B, C FROM TEST WHERE C = (SELECT MAX(C) FROM TEST) AND Z = 'xxxxx' AND Y = 'x' AND X = 'Y' ※項目X, Y, ZはTESTテーブルのカラムです ※上記SQLを、A、Bのみ取得用とCのみ取得用に   それぞれ分解して実行すると、それぞれの結果は   正常に取得できます。 2つの結果を1つのSQLで取得することは可能でしょうか? どなたかご教授願えますか?よろしくお願いいたします。

  • 指定した区分と一致するコードは取得しないSQL

    いつもお世話になります。 以下のデータ構成で、区分に「A01」「D01」のいづれかが含まれているコードは 取得しないようにしたいのですが、これを、SQLのみで実現するためにはどのように すればよいでしょうか。 【テーブル】 コード 区分 10000  A01 10000  B01 10000  C01 20000  C01 20000  D01 30000  B01 30000  E01 40000  B01 40000  E01 40000  F01 ↓ 【結果】 30000 40000 ※コード10000はA01が含まれており、20000はD01が含まれているため対象外 普通のプログラムならば、全て取得してきて、ループしながら該当する区分の場合は continueするなりしてはじけばい、というように想像できるのですが、SQLのみでやるということで、 ループ処理は行えないためどうしてもスマートな方法が思いつきません。 何かよい方法はないでしょうか。 宜しくお願いします。

  • データベースのテーブルやカラム情報の取得

    データベースの定義を取得するSQL文を教えてください。 データベースはAccessとMySQLです。 得たい情報はデータベースにあるテーブルとカラムです。 例えば、テーブルがTblAとTblBがあって、 それぞれに整数型のFld1と文字型のFlb2があるとします。 この定義情報を取得したいのです。 テーブルだけでなくクエリ(ビュー)の定義情報も取得できるでしょうか。

    • ベストアンサー
    • MySQL
  • SQL 関数ループでデータ取得

    SQL 関数ループでデータ取得 オラクルSQLで、FUNCTIONを作成し、その結果データを取得するSQLを作っています。(下記参照) begin buffer := null; for i IN 1..5 LOOP buffer := 【関数A(i)】; END LOOP; return buffer; イメージとしては、シーケンス番号(i)によって異なるデータを1つずつ取得したいのですが、 上記のようにすると、1回のループ毎にbufferが書き換えられ、結局最後のデータしか取得できません。 END LOOP前にreturnをはさんでしまうとその時点で関数が終了してしまうので逆に、最初のデータ しか取得できませんし。 上記のような関数を使う理由は、上記のiを固定(下記で言うi IN 1..5)でなく、 データの個数を可変で取得する仕様を考えているからです。具体的にはMAX関数でシーケンス番号の最大値を用意し、そのデータの個数取得できるようなものを考えています。 固定ならば、下記のようにその個数分関数を記述すればいいですので 【関数A(1)】; 【関数A(2)】; : 【関数A(5)】; 記述を1行で個数分のデータを取得できる方法はないでしょうか? SQLに詳しい方、ぜひご教授ください。

  • 複数のSQLサーバから、SQLサーバにデータを取得する方法

    3台のSQLサーバのデータを、1台のSQLサーバで日々自動で取得するにはどういう方法が良いでしょうか 3台のSQLサーバからは、同じ属性のテーブル情報を1つのテーブルに取得したい(更新日が前日分) PGはVB.netで考えています ご指導お願いします

  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。