2009-05-06 12 views
2

これは一般的な問題だと思うが、私のGoogle検索では、私の問題に特有の解決策を見つけることができない。組織図のSQLクエリ?

私のデータベースに組織(テーブル)のリストがあり、その階層に基づいてクエリを実行できる必要があります。たとえば、最高の組織に問い合わせると、その組織の下にリストされているすべての組織のIDを返すことになります。さらに、ミドルレンジの組織に問い合わせると、その組織の下にリストされている組織IDだけが必要です。

a)データベーススキーマとb)クエリを設定するにはどうすればよいですか?一番上の組織IDを送信し、その組織の下でIDを取得するだけでよいです。

私はそれが理にかなっていると思いますが、必要であれば明確にすることができます。

+0

あなたの問題に対する同様の回答: http://stackoverflow.com/questions/38801/sql-how-to-store-and-navigate-hierarchies http://stackoverflow.com/questions/378608/how-与えられたノードの下にある-i-select-all-leaf-nodes-in-a-SQL-hierarchyノード – Nick

+0

mssqlの場合はどのバージョン/タイプですか? 2005/2008では、CTEを使用してデータを簡単に退化させることができます。 – u07ch

+0

これをどのように表示するのか不思議です。私はあなたがチャートを言った知っているが、どのように、どのライブラリですか? – johnny

答えて

2

1つの簡単な方法は、同様に、テキストフィールドに、組織の親子を格納することです。ヨーロッパの各販売組織について、SALES-EUROPE-%のクエリ。

組織の名前を変更する場合は、その子組織も更新するように注意してください。

これにより、再帰なしで簡単に、柔軟性を保ちます。

+0

私が知っている限り、これはあなたが決まった数のクエリで結果を得ることができる唯一のソリューションです(うまくいけば - 1)。 parent_idフィールドを格納する他の方法はすべて、多くのクエリと潜在的なパフォーマンスの問題を引き起こします。これを唯一のIDとして使用すると、データベースに最適ではないログIDが得られるので、セカンダリキーなどのキーを使用することができます。 –

+0

パーフェクト!ありがとう! –

+0

これは厳しい解決策であり、階層が変わったときに本当にひどく噛み付くように戻ってくるでしょう。それは、私の会社が何年も私たちのシステムからゆっくりとリファクタリングしてきたことです...とても痛いものです。私は一度見たより良いアプローチを掘り下げようとします。 – rmeador

0

組織にID PKとそのIDへの親FK参照を持たせることができます。次に、クエリに対して、(データベースバックエンドでサポートされている場合)再帰クエリ、別名Common Table Expressionsを使用します。

1

簡単な方法は、同じテーブルのID列への外部キーであるParentID列、ルートノードのNULLを持つことです。しかし、この方法にはいくつかの欠点があります。

Nested setsは、リレーショナルデータベースにツリーを格納する効率的な方法です。

SALES-EUROPE-NORTH

すべての販売組織を検索するには、あなたがSALES-%で問い合わせることができます:

+0

私は自分の答えにあなたのコメントを読んだときに気づきました。私の答えと同じものに既にあなたの答えの中にリンクがあったことがわかりました...私が投稿した前に気づいたら、私はあなたの答えを正しいもの。 – rmeador

3

私のコメントで約束したように、任意のサブツリーの一定時間の検索を可能にするデータベースに階層を格納する方法については、articleを掘り下げました。私はそれがあなたのニーズに合っていると思っています。これは、現在のアクセプタとしてマークされている答えよりも、使いやすさとアクセスのスピードの点で優れています。もともと私はウィキペディアでこれと同じコンセプトを見たことを誓うことができましたが、今はそれを見つけることができません。明らかに「修正された注文木のトラバーサル」と呼ばれています。その要点は、ツリーの各ノードに2回ずつ番号をつけ、深さ優先のトラバースを1回、途中で1回、バックアップの途中で(つまり、再帰的な実装でスタックをアンロールしているとき) 。これは、あるノードの子ノードが、そのノードの2つの番号の間にすべての番号を持つことを意味します。それらの列にインデックスを投げれば、本当に高速な検索ができます。私はそれがひどい説明だと確信しているので、記事を読んでください。これはもっと深く入り、写真を含みます。

+0

非常にクールな溶液。 – yetanotherdave

+0

この記事では、カスタムバランスツリーについて説明します。これは難解な解決策であり、階層が変わったときにあなたを噛ませるように戻ってくるでしょう。 ;-) – Andomar

+0

@Andromar:申し訳ありませんが、あなたの答えに対する私のコメントのちょっとした誇大宣言のためには... :)主な違いは、階層をリフレッシュすることは、変更が非常に速くて簡単な操作だということです。 – rmeador