ホームページ > データベース > mysql チュートリアル > SQLite3 の再帰クエリは複雑な階層データ関係をどのように解決できるのでしょうか?

SQLite3 の再帰クエリは複雑な階層データ関係をどのように解決できるのでしょうか?

Susan Sarandon
リリース: 2025-01-03 03:46:37
オリジナル
183 人が閲覧しました

How Can Recursive Queries in SQLite3 Solve Complex Hierarchical Data Relationships?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート