tree_node
というテーブルがあり、それにはid
というプライマリキーがあり、parent_id
というNULL可能な列があり、テーブルにツリー構造(またはフォレスト)が埋め込まれていると仮定すると、どのようにしてツリー/フォレスト内のノードをSQLで効率的に使用する方法SQL内のツリーの深さ
答えて
再帰機能が必要です。再帰クエリ使用し、これは次のようになります。
WITH RECURSIVE node_ancestors(node_id, parent_id) AS (
SELECT id, id FROM tree_node WHERE id IN (1, 2, 3)
UNION ALL
SELECT na.node_id, tree_node.parent_id
FROM node_ancestors AS na, tree_node
WHERE tree_node.id = na.parent_id AND tree_node.parent_id IS NOT NULL
)
SELECT node_id, COUNT(parent_id) AS depth FROM node_ancestors GROUP BY node_id;
他のオプションは、ストアド・プロシージャで再帰を行うアプリケーションでの再帰を行うと、再帰の量を制限し、加入の多くを使用しています。
深度が無制限の場合、問題は再帰的であり、実際には簡単で効率的な解決策はありません。スキーマの制御があり、この種のデータに定期的にアクセスする必要がある場合、ネストしたセットとしてテーブルをリファクタリングすることができます。ネストされたセットとして、各要素の左と右の包含境界があります。これは、およそ、基本的な条件を備えた単一のクエリ内のノードの深さを計算できるようになる:木を処理する
select count(*) from tree_node
where left < myLeft
and right > myRight
一般的な方法は、KEYと親の通常の列に加えて、あなたも持っている、ですパスを構成するノードのキーを含む文字列値を含むPATH型の列(ルートからノード自体まで)、キーの一部ではない文字で区切られた列自体。
例を挙げましょう:
KEY PARENT PATH
1 - *1*
2 1 *1*2*
3 1 *1*3*
4 3 *1*3*4*
5 1 *1*5*
6 5 *1*5*6*
。これは主に、部門階層または類似のように、あまり変化していない木が使用されています。
このような文字列は、複数のルール(マルチキー、複数値フィールドなど)を無効にするように見えるため、正規化理論に厳密に従っているわけではありませんが、多くのシナリオではあなたが求めているもの
あなたの場合、問題のノードのTREE値を取得するだけで、最も簡単なものに応じて、区切り文字の数を数えたり、置換関数でそれらを削除したり、長さ
ここで彼らの深さで、あなたのノードの上のリストを与えるために、SQLです:
select KEY, PARENT, LEN(PATH)-LEN(REPLACE(PATH, '*', ''))-1 as DEPTH
from NODES
(注)このアプローチは、再帰的SQLのデータベースエンジンにより、特別な構文やサポートを必要とし、非常に適していないこと索引付けにもうまくいきます。
複数の値のフィールドを無効にしないことを除いて、それはまだ1つの特定のパス、1つの値だけです。また、保存パスと同時に、深さを一度計算し、共通の要件になる場合は保存することができます。 –
+1、これは私の好きな木の方法です。 – RedFilter
- 1. ランダムフォレストチューニング - ツリーの深さとツリーの数
- 2. スタックオーバーフローバイナリ検索ツリーの計算深さ
- 3. 深さ最初のツリーをテストする
- 4. SQL - HAVING節深さ
- 5. SQLで固定深度ツリーをモデリングする
- 6. 最小の深さのバイナリ検索ツリーの作成
- 7. 「深さの最初の検索」と「再帰ツリー」との同値
- 8. ツリー構造の深度ストリームを作成
- 9. なぜDOMツリーのプリオーダー、深さ優先のトラバーサルですか?
- 10. 計算ツリーの深さのJavaデータ構造
- 11. Java - ツリーを同じ深さのノードのリストに変換する
- 12. データベースのツリーの深さを制限する
- 13. nltkツリーから単語の深さを取得
- 14. 深さ最初にPythonでジェネレータを使用するツリーのトラバーサル
- 15. Azure SQLデータウェアハウスのsys.dm_pdw_exec_requestsの深さ
- 16. SQL Server:深さの階層クエリ
- 17. SQLの深さを理解する
- 18. ビットマップ内のポイントの深さを取得
- 19. ツリー深度再帰PHP配列
- 20. ツリーを深くコピーする方法は?
- 21. ツリー内のジェネリック
- 22. ピクセルの深さと色の深さ
- 23. Pythonのscikit-learnでツリーの深さにどのようにアクセスしますか?
- 24. Prolog:任意の量のサブツリーでツリーの深さを計算する方法は?
- 25. R:ツリーの最大深さを制御できる任意のランダムフォレストパッケージ?
- 26. ツリーの深さを数えるための再帰関数を書く
- 27. 左のデータベースクエリオプティマイザと並列処理の深い結合ツリー
- 28. C++バイナリ検索ツリーの印刷と深度の計算
- 29. ツリー内のBFS(レベルオーダートラバーサル)
- 30. HTML文書やCSSツリーの深さには限界がありますか?
素敵な機能。残念ながら、すべてのSQL実装には存在しません。 – Marian