SQLで再帰CTEを使用して階層データを照会するにはどうすればよいですか?
この記事では、階層データを照会するためのSQLの再帰的共通テーブル式(CTE)について説明します。組織チャートの例を使用して構造を詳しく説明し、無限の再帰や誤った結合などの一般的な落とし穴に対処します。オプティ
階層データに再帰CTEを使用します
再帰的な一般的なテーブル式(CTE)は、組織チャート、ファイルシステム、材料紙幣などの階層データを照会するためのSQLの強力なツールです。それらは、その定義内でCTE自体を繰り返し参照することにより、あなたが木のような構造を横断することを可能にします。基本構造には、アンカーメンバー(初期クエリ)と再帰メンバー(自己参照部分)が含まれます。
employees
という名前のテーブルで表される組織チャートの簡単な例で説明しましょう。
<code class="sql">CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(255), manager_id INT ); INSERT INTO employees (employee_id, employee_name, manager_id) VALUES (1, 'CEO', NULL), (2, 'VP Sales', 1), (3, 'Sales Rep 1', 2), (4, 'Sales Rep 2', 2), (5, 'VP Marketing', 1), (6, 'Marketing Manager', 5);</code>
CEO(Employee_id 1)の下で階層全体を取得するには、再帰CTEを使用します。
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Selects the CEO SELECT employee_id, employee_name, manager_id, 0 as level FROM employees WHERE employee_id = 1 UNION ALL -- Recursive member: Joins with itself to find subordinates SELECT e.employee_id, e.employee_name, e.manager_id, eh.level 1 FROM employees e INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id ) SELECT * FROM EmployeeHierarchy;</code>
このクエリはCEOから始まり、従業員が既に含まれている従業員に報告しなくなるまで、部下を再帰的に追加します。 level
列は、階層の深さを示します。 UNION ALL
アンカーと再帰メンバーの結果を組み合わせています。重要なのは、各従業員をマネージャーにリンクするemployees
とEmployeeHierarchy
との間の自己結合と再帰メンバーの自己結合です。
再帰的なCTEを使用する際に避けるべき一般的な落とし穴
再帰的なCTEを使用すると、いくつかの落とし穴が誤った結果やパフォーマンスの問題につながる可能性があります。
- 無限の再帰:最も一般的な間違いは、データにサイクルを作成するか、適切な終了条件を持たない再帰クエリを作成することです。これにより、クエリが無期限に実行されます。データが非環状であることを確認し(従業員は自分自身に直接または間接的に報告していません)、再帰メンバーが最終的に終了することを確認します(たとえば、階層の葉のノードに到達することにより)。
- 誤った結合条件:再帰メンバーの誤った結合条件を使用すると、欠落または追加のデータが発生します。結合条件を注意深く確認して、データの階層的な関係を正確に反映していることを確認してください。
-
終了条件の欠如:再帰的なCTEには、無限のループを防ぐために明確な終了条件が必要です。これは通常、特定の値(親ID列の
NULL
など)をチェックするか、再帰深度を制限することによって行われます。 -
データの複製を無視する:
UNION ALL
UNION
を使用するには、階層に存在する場合は重複する行が含まれます。重複を排除する必要がある場合は、UNION
使用してください。ただし、UNION ALL
すべて一般的に高速です。
大規模なデータセットの再帰CTEクエリの最適化
再帰的なCTEは、非常に大きな階層データセットで遅くなる可能性があります。いくつかの最適化戦略により、パフォーマンスを改善できます。
- インデックス作成:結合条件(通常は親子関係列)で使用される列に適切なインデックスが存在するようにします。インデックスは、再帰CTE内の結合を大幅に高速化します。
-
フィルタリング:アンカーおよび/または再帰メンバーに
WHERE
を追加して、階層の不要な枝を除外することにより、再帰の範囲を制限します。これにより、処理されたデータの量が減少します。 - 具体化されたビュー:頻繁に実行される再帰クエリについては、階層データを事前にコンピューターする具体化されたビューを作成することを検討してください。これにより、ストレージスペースといくつかのデータのlust性のコストでクエリのパフォーマンスを大幅に改善できます。
- 代替アプローチ:非常に大きなデータセットの場合、特定の階層クエリのパフォーマンスを向上させることができる隣接リストやネストされたセットを使用するなどの代替アプローチを検討してください。再帰的なCTEは、常にすべてのシナリオに最適なソリューションではありません。
- バッチ処理:階層全体を1回のクエリで処理する代わりに、それを小さなバッチに分割することを検討してください。
さまざまなデータベースシステムの再帰CTE
再帰的なCTEは、ほとんどの主要なデータベースシステムでサポートされていますが、構文はわずかに異なる場合があります。
- SQL Server:
WITH RECURSIVE
使用します(ただし、RECURSIVE
キーワードはオプションです)。 - PostgreSQL:
WITH RECURSIVE
使用します。 - MySQL:バージョン8.0からの再帰CTEをサポートします。構文はPostgreSQLに似ています。
- Oracle:最初のCTEをサポートし、
START WITH
CONNECT BY
。これは、わずかに異なる構文を持っていますが、同じ機能を実現します。
コア概念は異なるシステムで同じままですが、正しい構文とシステム固有の制限または最適化については、特定のデータベースシステムのドキュメントを必ず参照してください。クエリを徹底的にテストし、パフォーマンスをプロファイルしてボトルネックを識別および対処することを忘れないでください。
以上がSQLで再帰CTEを使用して階層データを照会するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











DateTimeデータ型は、0001-01-01-01 00:00:00:00:00:00:00:00:00:00:00:00:59:59.999999999:59:59.99999999の範囲の高精度の日付情報を保存するために使用され、内部はdateTime(精度)です。変換機能は機能しますが、精度、範囲、およびタイムゾーンを変換する際に潜在的な問題に注意する必要があります。

SQL ServerでSQLステートメントを使用してテーブルを作成する方法:SQL Server Management Studioを開き、データベースサーバーに接続します。データベースを選択してテーブルを作成します。作成テーブルステートメントを入力して、テーブル名、列名、データ型、制約を指定します。 [実行]ボタンをクリックしてテーブルを作成します。

SQLステートメントは、SQLステートメントを条件付きで実行するために使用され、構文は次のようになります。if(条件)then {ステートメント} else {ステートメント} end if;。条件は有効なSQL式である可能性があり、条件が真の場合、then句を実行します。条件が偽の場合は、else句を実行します。ステートメントをネストできる場合、より複雑な条件付きチェックを可能にします。

外部のキーの制約は、データの整合性、一貫性、および参照の整合性を確保するために、テーブルの間に参照関係がある必要があることを指定します。特定の機能には、以下が含まれます。データの整合性:違法データの挿入または更新を防ぐために、メインテーブルに外部キー値が存在する必要があります。データの一貫性:メインテーブルデータが変更されると、外部キーの制約は、関連データを自動的に更新または削除して、同期し続けます。データ参照:表間の関係を確立し、参照の整合性を維持し、関連データの追跡と取得を促進します。

sqlで異なる使用を使用して重複排除するには2つの方法があります。選択した列の一意の値のみが保存され、元のテーブル順序が維持されます。グループ:グループ化キーの一意の値を保持し、テーブルの行を再注文します。

一般的なSQL最適化方法は次のとおりです。インデックス最適化:適切なインデックスアクセラレーションされたクエリを作成します。クエリの最適化:マルチテーブル結合の代わりに、正しいクエリタイプ、適切な結合条件、およびサブクエリを使用します。データ構造の最適化:適切なテーブル構造、フィールドタイプを選択し、ヌル値の使用を避けるようにしてください。クエリキャッシュ:クエリキャッシュを有効にして、頻繁に実行されるクエリ結果を保存します。接続プールの最適化:接続プールを使用して、マルチプレックスデータベース接続を行います。トランザクションの最適化:ネストされたトランザクションを避け、適切な分離レベルを使用し、バッチ操作を使用します。ハードウェアの最適化:ハードウェアをアップグレードし、SSDまたはNVMEストレージを使用します。データベースメンテナンス:インデックスメンテナンスタスクを定期的に実行し、統計を最適化し、未使用のオブジェクトをクリーンにします。クエリ

SQLラウンド()関数は、指定された数字の数を丸めます。次の2つの用途があります。1。num_digits&gt; 0:小数点に丸められています。 2。Num_Digits&lt; 0:整数の場所に丸みを帯びています。

この記事では、SQLステートメントを使用して3つのテーブルに参加する詳細なチュートリアルを紹介し、読者にさまざまなテーブルのデータを効果的に相関させる方法を学習するよう指導します。例と詳細な構文の説明を使用して、この記事では、SQLのテーブルの参加手法を習得して、データベースから関連情報を効率的に取得できるようにします。
