none
SQLでツリー構造を構築するのに適切な順番で出力するクエリ RRS feed

  • 質問

  • 親ID ID
    NULL 0
    0 1
    1 2
    0 3
    親子表
    この表により
    0
    ├1
    │└2
    └3
    といったツリーを構築したいです。
    ツリーはテキストだったりXMLのDomだったりします。
    その為にクエリの出力結果は親子表の順番に出てこればいいわけですがどのようなクエリにすれば親子表のような順で出力できるかわかりません。
    恐らくは自己結合は使うような気はしますがどのようなクエリが考えられるでしょうか?
    2009年10月11日 15:24

回答

  • テキストの場合、「│├└」の3種類を使うことになるんでしょうが、そこは手作業と同じアルゴリズムを書くことになるかと。
    とりあえずWITH を使うのかな。MSDN Libraryは年々サンプルが消えていくので英語版の方のWITH も。
    # あほらしいからサンプル復活させてよ…。この手の全体としてバグってるという指摘は言っても聞かないからなぁ…。
    WITHで深さを求めて、深さ-1の数だけ「│」。あとはleafの最後が「└」でそれ以外が「├」かな。

    XMLのDOMの場合、XMLのことはXMLに任せた方がいいと思います。SQLはフラットに出力しておいてXSLTで変換してしまう。

    ちなみにこういったデータ構造を表すためにSQL Server 2008からhierarchyid が用意されています。
    • 回答としてマーク 和和和 2009年10月13日 2:36
    2009年10月11日 23:17
  • hierarchyid よさげですね。ありがとうございます。

    階層の深さが分かっているのであれば、その分だけ結合しIDでソートすればいけるかと思いますが、
    階層の深さが未知の場合、 自己結合だけでは難しいと思います。
    [カーソル|一時テーブル]を使うのが良いのではないでしょうか?

    Toshiya TSURU
    http://www.google.com/profiles/turutosiya
    • 回答としてマーク 和和和 2009年10月13日 2:36
    2009年10月12日 9:08

すべての返信

  • テキストの場合、「│├└」の3種類を使うことになるんでしょうが、そこは手作業と同じアルゴリズムを書くことになるかと。
    とりあえずWITH を使うのかな。MSDN Libraryは年々サンプルが消えていくので英語版の方のWITH も。
    # あほらしいからサンプル復活させてよ…。この手の全体としてバグってるという指摘は言っても聞かないからなぁ…。
    WITHで深さを求めて、深さ-1の数だけ「│」。あとはleafの最後が「└」でそれ以外が「├」かな。

    XMLのDOMの場合、XMLのことはXMLに任せた方がいいと思います。SQLはフラットに出力しておいてXSLTで変換してしまう。

    ちなみにこういったデータ構造を表すためにSQL Server 2008からhierarchyid が用意されています。
    • 回答としてマーク 和和和 2009年10月13日 2:36
    2009年10月11日 23:17
  • hierarchyid よさげですね。ありがとうございます。

    階層の深さが分かっているのであれば、その分だけ結合しIDでソートすればいけるかと思いますが、
    階層の深さが未知の場合、 自己結合だけでは難しいと思います。
    [カーソル|一時テーブル]を使うのが良いのではないでしょうか?

    Toshiya TSURU
    http://www.google.com/profiles/turutosiya
    • 回答としてマーク 和和和 2009年10月13日 2:36
    2009年10月12日 9:08
  • SQL Server2005の環境なのでまず2008で目的の機能が実現できるかどうか、出来るならば2008を導入できるかどうかを掛け合ってみます。
    概念を理解するのに非常に難しい難易度だと思いました。
    2009年10月13日 2:41
  • 無理に2008のhierarchyidを使わなくてもいいんじゃないでしょうか?
    私も今のプロジェクトでは使っていません。
    WITHは2005でも使えます。
    2009年10月13日 3:37