SQLを使用してリレーショナルデータベースでツリー状のデータを走査する


16

SQLでツリーデータをトラバースする方法はありますか?私connect byはOracleで知っていますが、他のSQL実装でこれを行う別の方法はありますか?connect by各結果に対してクエリを実行するループまたは再帰関数を作成するよりも使用する方が簡単だからです。

「ツリーデータ」というフレーズに混乱しているように見える人もいるので、さらに説明しparent_idます。つまり、同じテーブル内の別の行の主キーを含む、または同様のフィールドを持つテーブルに関してです。

問題は、この方法でOracleデータベースに保存されたデータを操作していて、connect by他のDBMSに実装されていないことを知っていた経験からです。標準SQLを使用する場合は、上位にしたい親ごとに新しいテーブルエイリアスを作成する必要があります。これは簡単に手に負えなくなる可能性があります。


Joe Celkoのソリューションがあります。少数のサンプル:SQLで木Oracleで木と階層ネストされたセットモデル。構文シュガーを使用する必要はありません;-)。
マリアン

回答:


14

Celkoの本は良いリソースです-少し過度に「アカデミック」である場合。

また、「クロージャテーブル」と呼ばれるこの方法が非常にうまく機能することも本当にわかりました 。

再帰的なCTE(PostgreSQL 8.4以降、またはSQL Server 2005 以降など)を許可するデータベースを使用している場合、それらは本当に最適な方法です。Oracleを使用している場合は、常に由緒ある"connect by"があります。

私の経験では、クリーナーを作成する機会を得るよりも、「単純なツリー」スキーマでテーブルのセットを渡され、そのストレージから正しいツリーを抽出する方法を理解する必要があることがはるかに一般的です。 「クロージャテーブル」構造。


9

再帰CTEが最も簡単なソリューションになります。SQL Server 2005およびPostgreSQLの現在のバージョンは、CTEをサポートしています。SQL Server 2008以降を使用しているHIERARCHYID場合は、データ型を使用できます。この良い例は、HierarchyID:SQL Server 2008を使用したデータ階層のモデル化で見つけることができます。

追加のリソース:


5

SQL Server(2005以降のエディション)では、共通テーブル式を使用して階層を読み取ることができます。いくつかの例については、Microsoft SQL Server 2005-CTEの単純な階層の例を参照してください。

私は実際にこの本を実際に見たことはありませんが、より一般的にこのテーマに関する本「Joe Celko」による「SQL for Smartiesのツリーと階層」を推奨されています。


1

標準のSQLメソッドは、再帰CTEによって提供さWITH [ RECURSIVE ]れ、クエリのように指定される「再帰クエリ」です。実装は仕様で指定されておらず、再帰的な構造のクエリで使用できるメソッドのみが指定されています。最も単純なケースでは、データ構造の実装には、行にIDと親IDのみが必要です。

また、RDBMS固有のソリューションも多数あります。たとえば、PostgreSQLは再帰CTEをサポートしますltreeが、実装においてさまざまな利点と欠点のセットを提供します。

タグを検索すると、このサイトの詳細情報を見つけることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.