SQLite3 の再帰クエリ: 複雑な階層データ関係の解決
広く使用されているデータベース エンジンである SQLite3 には、伝統的に再帰クエリのサポートがありませんでした。階層データ構造を扱う際に課題が生じます。ただし、SQLite 3.8.3 の Common Table Expressions (CTE) の導入により、ユーザーは再帰クエリを実行できるようになりました。
再帰クエリの例
次の構造を持つ「Part」という名前のテーブル:
Table: Part Part SuperPart wk0Z wk00 wk06 wk02 wk07 wk02 eZ01 eZ00 eZ02 eZ00 eZ03 eZ01 eZ04 eZ01
すべてのペアを検索するには特定の「SuperPart」とそのサブパーツについては、再帰クエリが必要です。たとえば、「SuperPart」eZ00 の場合、クエリは (eZ00, eZ01)、(eZ01, eZ03)、(eZ00, eZ03) などのペアを返す必要があります。
再帰 CTE の使用
SQLite 3.8.3 以降、再帰的CTE はそのようなクエリに使用できます。次のクエリは、CTE を活用して目的の結果を実現します。
WITH RECURSIVE subParts AS ( SELECT Part, SuperPart FROM Part WHERE SuperPart = :superPart UNION ALL SELECT p.Part, p.SuperPart FROM Part AS p JOIN subParts AS sp ON p.SuperPart = sp.Part ) SELECT Part, SuperPart FROM subParts;
このクエリは、「subParts」という名前の CTE を使用して、指定された「SuperPart」のすべてのサブパートを繰り返し検索します。再帰的な「UNION ALL」句により、CTE が自己結合できるようになり、階層を横断して必要なペアを収集できるようになります。
クライアント コード再帰の使用
CTE サポートがない 3.8.3 より前の SQLite バージョンの場合は、クライアント コードの再帰を使用する必要があります。これには、データが返されなくなるまで行とサブパート ID を手動で取得することが含まれます。次のスニペットは、このアプローチを示しています:
# Recursive helper function def get_subparts(superPart): # Get initial row and sub-part IDs row = select_one("SELECT Part, SuperPart FROM Part WHERE SuperPart = ?", (superPart,)) if not row: return # Yield current sub-part yield row['Part'] # Recursively get sub-parts of sub-parts for subPart in get_subparts(row['Part']): yield subPart # Iterate over sub-parts using client-code recursion for subPart in get_subparts("eZ00"): print(subPart)
以上がSQLite3 の再帰クエリは複雑な階層データ関係をどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。