首页 > 数据库 > 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 中引入通用表表达式 (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 能够自连接,从而允许它遍历层次结构并收集所需的对。

使用客户端代码递归

对于 3.8.3 之前的 SQLite 版本,缺少 CTE 支持,必须使用客户端代码递归。这涉及手动检索行和子部分 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板