<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=With_%28SQL%29</id>
	<title>With (SQL) - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=With_%28SQL%29"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=With_(SQL)&amp;action=history"/>
	<updated>2026-06-30T19:56:32Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=With_(SQL)&amp;diff=4870815&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot：​Add 2 books for verifiability (20260407)) #IABot (v2.0.9.5) (GreenC bot</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=With_(SQL)&amp;diff=4870815&amp;oldid=prev"/>
		<updated>2026-04-08T04:40:14Z</updated>

		<summary type="html">&lt;p&gt;Add 2 books for verifiability (20260407)) #IABot (v2.0.9.5) (&lt;a href=&quot;/index.php?title=User:GreenC_bot&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:GreenC bot（页面不存在）&quot;&gt;GreenC bot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;在[[SQL]]数据库中，处理组织架构、家族树、文件系统等[[层次模型]]数据的主要手段有两种：&amp;#039;&amp;#039;&amp;#039;递归公用表表达式&amp;#039;&amp;#039;&amp;#039;（Recursive CTE）与 &amp;lt;code&amp;gt;CONNECT BY&amp;lt;/code&amp;gt;子语句。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;层级查询&amp;#039;&amp;#039;&amp;#039;（Hierarchical Query）是一种处理[[层次模型]]数据的[[Select (SQL)|SQL查询]]，本质上是更通用的“递归[[不动点]]查询（Recursive Fixpoint Queries）”的特殊形式，主要用于计算数据的[[传递闭包]]（Transitive Closures）。 &lt;br /&gt;
&lt;br /&gt;
自{{tsl|en|SQL:1999}}标准发布以来，层级查询正式确立了以&amp;#039;&amp;#039;&amp;#039;递归公用表表达式&amp;#039;&amp;#039;&amp;#039;（recursive CTE）为核心的实现方式。与[[Oracle]]早期的[[#CONNECT BY|connect-by子句]]不同，递归CTE从设计之初就包含了不动点语义（Fixpoint Semantics）。&amp;lt;ref name=&amp;quot;JimMelton1&amp;quot;&amp;gt;{{cite book|author1=Jim Melton|author2=Alan R. Simon|title=SQL:1999: Understanding Relational Language Components|url=https://books.google.com/books?id=wyhXvU0Eyg0C&amp;amp;pg=PA352|year=2002|publisher=Morgan Kaufmann|isbn=978-1-55860-456-8}}&amp;lt;/ref&amp;gt;这一标准实现很大程度上借鉴了[[IBM DB2]]版本2中的实现。&amp;lt;ref name=&amp;quot;JimMelton1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
目前，递归 CTE 已获得业界主流数据库的广泛支持，包括[[Microsoft SQL Server]]（自 SQL Server 2008 R2 起）、&amp;lt;ref name=&amp;quot;msdnRCTEs&amp;quot;&amp;gt;{{cite web |url=http://msdn.microsoft.com/en-us/library/ms186243.aspx |title=Recursive Queries Using Common Table Expressions |author=Microsoft |access-date=2009-12-23 |archive-date=2009-12-08 |archive-url=https://web.archive.org/web/20091208074238/http://msdn.microsoft.com/en-us/library/ms186243.aspx |dead-url=no }}&amp;lt;/ref&amp;gt; [[Firebird_(数据库)|Firebird 2.1]]、&amp;lt;ref&amp;gt;{{cite web |url=http://firebirdsql.org/rlsnotesh/rlsnotes210.html#rnfb210-cte |title=Firebird 2.1 Release Notes |author=Helen Borrie |date=2008-07-15 |access-date=2015-11-24 |archive-date=2017-04-22 |archive-url=https://web.archive.org/web/20170422120124/http://www.firebirdsql.org/rlsnotesh/rlsnotes210.html#rnfb210-cte |dead-url=no }}&amp;lt;/ref&amp;gt; [[PostgreSQL|PostgreSQL 8.4+]]、&amp;lt;ref&amp;gt;{{cite web|url=http://www.postgresql.org/docs/current/interactive/queries-with.html|title=WITH Queries|date=10 February 2022|access-date=2026-03-13|archive-date=2016-05-01|archive-url=https://web.archive.org/web/20160501201010/http://www.postgresql.org/docs/current/interactive/queries-with.html|dead-url=no}} PostgreSQL&amp;lt;/ref&amp;gt; [[SQLite|SQLite 3.8.3+]]、&amp;lt;ref&amp;gt;{{cite web |url=http://www.sqlite.org/lang_with.html |title=WITH Clause |access-date=2026-03-13 |archive-date=2019-07-05 |archive-url=https://web.archive.org/web/20190705192212/https://sqlite.org/lang_with.html |dead-url=no }} SQLite&amp;lt;/ref&amp;gt; {{tsl|en|Informix|IBM Informix}} 11.50+ 版本、[[CUBRID]]、[[MariaDB|MariaDB 10.2+]]以及[[MySQL|MySQL 8.0.1+]]的支持。&amp;lt;ref&amp;gt;{{cite web |url=https://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/ |title=MySQL 8.0 Labs: [Recursive] Common Table Expressions in MySQL (CTEs) |access-date=2017-12-20 |archive-date=2019-08-16 |archive-url=https://web.archive.org/web/20190816150345/https://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/ |url-status=dead }} mysqlserverteam.com&amp;lt;/ref&amp;gt;此外，BI工具如[https://kb.tableau.com/articles/howto/using-common-table-expressions Tableau已提供相关应用文档] {{Wayback|url=https://kb.tableau.com/articles/howto/using-common-table-expressions |date=20190801173558 }}。但TIBCO Spotfir仍未支持CTE。而Oracle 11g Release 2的实现仍缺乏不动点语义。&lt;br /&gt;
&lt;br /&gt;
如果没有公用表表达式或&amp;lt;code&amp;gt;connect-by&amp;lt;/code&amp;gt;子句，可以通过用户定义的递归函数来实现层级查询。&amp;lt;ref&amp;gt;[http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=24 Paragon corporation: Using PostgreSQL User-Defined Functions to solve the Tree Problem] {{Wayback|url=http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=24 |date=20150923122127 }}, February 15, 2004, accessed September 19, 2015&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 公用表表达式 == &lt;br /&gt;
在[[SQL]]中，&amp;#039;&amp;#039;&amp;#039;公用表表达式&amp;#039;&amp;#039;&amp;#039;（Common table expression, CTE），是一个临时命名的结果集，它派生自简单的查询，并在&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; 语句的执行范围内定义。&lt;br /&gt;
&lt;br /&gt;
CTE可视为派生表（[[查询_(SQL)|子查询]]）、[[视图]]或内联用户自定义函数的替代方案。&lt;br /&gt;
&lt;br /&gt;
CTE的实现支持：[[天睿|Teradata]]（从版本14开始）、[[IBM DB2]]、{{tsl|en|Informix|IBM Informix}}（从版本14.1开始）、[[Firebird_(数据库)|Firebird]]（从版本2.1开始）、&amp;lt;ref&amp;gt;{{Cite web| title=Firebird 2.5 Language Reference Update | url=https://firebirdsql.org/file/documentation/reference_manuals/reference_material/Firebird-2.5-LangRef-Update.pdf | archive-url=https://web.archive.org/web/20111114164747/http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/Firebird-2.5-LangRef-Update.pdf | archive-date=2011-11-14}}&amp;lt;/ref&amp;gt; [[Microsoft SQL Server]]（从2005版本开始）、[[Oracle数据库|Oracle]]（从11g release 2开始支持递归）、[[PostgreSQL]]（自8.4版本起）、[[MariaDB]]（自10.2版本起&amp;lt;ref&amp;gt;{{Cite web |title=MariaDB 10.2.0 Changelog |url=https://mariadb.com/kb/en/mariadb-1020-changelog/ |access-date=2024-12-22 |website=MariaDB KnowledgeBase}}&amp;lt;/ref&amp;gt;）、[[MySQL]]（自8.0版本起）、[[SQLite]]（自3.8.3版本起）、[[HSQLDB|HyperSQL]]、{{tsl|en|Informix|IBM Informix}}（自 14.10 版本起）、&amp;lt;ref&amp;gt;possible before 14.10 with temp tables https://stackoverflow.com/questions/42579298/why-does-a-with-clause-give-a-syntax-error-on-informix&amp;lt;/ref&amp;gt; Google [[BigQuery]]、[[Adaptive Server Enterprise|Sybase]]（从版本 9 开始）、[[Vertica]]、[[H2数据库|H2]]（实验性支持）、&amp;lt;ref&amp;gt;{{Cite web|url=http://www.h2database.com/html/advanced.html#recursive_queries|title=Advanced|access-date=2026-03-13|archive-date=2006-07-09|archive-url=https://web.archive.org/web/20060709042853/http://www.h2database.com/html/advanced.html#recursive_queries|dead-url=no}}&amp;lt;/ref&amp;gt;以及[[关系型数据库管理系统比较|许多其他数据库]]的支持。Oracle将CTE称为“子查询分解”（subquery factoring）。&amp;lt;ref name=&amp;quot;MortonSands2010&amp;quot;&amp;gt;{{cite book|author1=Karen Morton|author2=Robyn Sands|author3=Jared Still|author4=Riyaj Shamsudeen |author5=Kerry Osborne|title=Pro Oracle SQL|url=https://books.google.com/books?id=nrwu-f4JwjcC&amp;amp;pg=PA283|year=2010|publisher=Apress|isbn=978-1-4302-3228-5|page=283}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CTE（可以是递归的，也可以不是）的语法如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt; &lt;br /&gt;
WITH [RECURSIVE] with_query [, ...]  -- 这里可以依次定义多个CTE，数据库引擎会逐个依次生成结果集，后面的CTE可以引用前面定义的CTE&lt;br /&gt;
SELECT ...                           -- 在查询中使用CTE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中 &amp;lt;code&amp;gt;with_query&amp;lt;/code&amp;gt; 的语法为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt; &lt;br /&gt;
query_name [ (column_name [,...]) ]  -- 可定义列名&lt;br /&gt;
AS (SELECT ...) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;WITH RECURSIVE&amp;lt;/code&amp;gt;是{{tsl|en|SQL:1999}}标准提供的递归公共表表达式（Recursive CTE）实现机制，用来在一条SQL内完成“循环/递归”类计算（树遍历、层级展开、生成序列、图遍历等）。其核心结构是：锚点查询（anchor）+ 递归查询（recursive）用&amp;lt;code&amp;gt;UNION [ALL]&amp;lt;/code&amp;gt;连接，递归部分引用CTE自身，直到不再产生新行即终止。由于不会自动创建伪列（如[[#Pseudo-columns|下文]]提到的&amp;lt;code&amp;gt;LEVEL&amp;lt;/code&amp;gt;），其语法更加复杂。如果需要这些伪列，必须在代码中自行创建。有关教程示例，请参阅 MSDN 文档&amp;lt;ref name=&amp;quot;msdnRCTEs&amp;quot;/&amp;gt;或 IBM 文档。&amp;lt;ref&amp;gt;{{Cite web|url=http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2z9.doc.apsg/src/tpc/db2z_xmprecursivecte.htm|title = IBM Docs}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web|url=http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafyrecursivequeries.htm|title=IBM Docs}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
除了PostgreSQL，其他数据库系统中&amp;lt;code&amp;gt;WITH&amp;lt;/code&amp;gt;之后通常不需要&amp;lt;code&amp;gt;RECURSIVE&amp;lt;/code&amp;gt;关键字。&amp;lt;ref name=&amp;quot;ObeHsu2012&amp;quot;&amp;gt;{{cite book|author1=Regina Obe|author2=Leo Hsu|title=PostgreSQL: Up and Running|url=https://books.google.com/books?id=Q8jkIZkMTPcC&amp;amp;pg=PA94|year=2012|publisher=O&amp;#039;Reilly Media|isbn=978-1-4493-2633-3|page=94}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在SQL:1999标准中，递归CTE查询可以出现在任何允许查询的地方。例如，可以使用 &amp;lt;code&amp;gt;CREATE&amp;lt;/code&amp;gt; [&amp;lt;code&amp;gt;RECURSIVE&amp;lt;/code&amp;gt;] &amp;lt;code&amp;gt;VIEW&amp;lt;/code&amp;gt; 为结果命名。&amp;lt;ref&amp;gt;{{cite book|author1=Jim Melton|author2=Alan R. Simon|title=SQL:1999: Understanding Relational Language Components|url=https://books.google.com/books?id=wyhXvU0Eyg0C&amp;amp;pg=PA352|year=2002|publisher=Morgan Kaufmann|isbn=978-1-55860-456-8|page=352}}&amp;lt;/ref&amp;gt; 在 &amp;lt;code&amp;gt;INSERT INTO&amp;lt;/code&amp;gt; 中使用 CTE，可以用递归查询生成的数据填充表；利用这种技术可以实现随机数据生成，而无需使用任何过程化语句。&amp;lt;ref name=&amp;quot;ChamberlinChamberlin1998&amp;quot;&amp;gt;{{cite book|author1=Don Chamberlin|title=A Complete Guide to DB2 Universal Database|url=https://books.google.com/books?id=hb4zskzHrWYC&amp;amp;pg=PA253|year=1998|publisher=Morgan Kaufmann|isbn=978-1-55860-482-7|pages=253–254}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一些数据库（如 PostgreSQL）支持较短的 CREATE RECURSIVE VIEW 格式，该格式在内部被转换为 WITH RECURSIVE 编码。&amp;lt;ref&amp;gt;{{Cite web|url = https://www.postgresql.org/docs/10/static/sql-createview.html|title = Create View|date = 10 February 2022|access-date = 2026-03-13|archive-date = 2018-10-04|archive-url = https://web.archive.org/web/20181004215834/https://www.postgresql.org/docs/10/static/sql-createview.html|dead-url = no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
递归CTE的语法框架： &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt; &lt;br /&gt;
WITH RECURSIVE cte_name (col1, col2, ...) AS (&lt;br /&gt;
  -- 1) anchor member（锚点/基线查询）：初始行集（递归的起点，生成第0层/第1层数据，不引用 cte_name）&lt;br /&gt;
  SELECT ...&lt;br /&gt;
&lt;br /&gt;
  UNION ALL   --  UNION ALL：保留重复，通常更快；需自己保证不会无限递归/爆炸重复。&lt;br /&gt;
              -- 或者UNION：自动去重，常用于防止图遍历重复节点，但代价更高。&lt;br /&gt;
&lt;br /&gt;
  -- 2) recursive member（递归成员查询）：递归行集（必须引用cte_name自身，基于上一轮结果生成下一轮结果）&lt;br /&gt;
  SELECT ...&lt;br /&gt;
  FROM cte_name&lt;br /&gt;
  WHERE ...   -- 终止条件（termination）写在这里：不再产生新行。例如层级上限、剩余字符串非空、未访问过等。&lt;br /&gt;
)&lt;br /&gt;
SELECT ...&lt;br /&gt;
FROM cte_name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
计算从0到9的[[阶乘]]的递归查询示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt; &lt;br /&gt;
WITH recursive temp (n, fact) AS (&lt;br /&gt;
    SELECT 0, 1                           -- 初始子查询&lt;br /&gt;
  UNION ALL&lt;br /&gt;
    SELECT n+1, (n+1)*fact FROM temp      -- 递归子查询&lt;br /&gt;
    WHERE n &amp;lt; 9&lt;br /&gt;
)&lt;br /&gt;
SELECT * FROM temp;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
SQL标准的递归CTE语义中，数据库引擎的递归执行模型只用上一轮新增行(称工作集或增量delta)去&amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt;基表生成下一批 delta，以避免指数级重复计算。最终结果是各轮delta的累积。绝大多数实现（PostgreSQL、SQL Server、DB2 等）都会用一个“工作表（working table）/队列”保存上一轮新增的行（delta），递归成员每轮只读取这批增量数据去&amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt;基表。即使把递归成员写成&amp;lt;code&amp;gt;JOIN cte_name&amp;lt;/code&amp;gt;，引擎在递归上下文里读取的就是“上一轮的工作集”，而不是“最终累计结果集”。SQL标准语义强调“递归直到不再产生新行”。&lt;br /&gt;
&lt;br /&gt;
以下为树/层级数据遍历（组织结构）的例子。假设基表为：&amp;lt;code&amp;gt;org(emp_id, manager_id, emp_name)&amp;lt;/code&amp;gt;，自顶向下展开（从某个经理开始找下属）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt; &lt;br /&gt;
WITH RECURSIVE sub_tree(emp_id, manager_id, emp_name, lvl, path) AS (&lt;br /&gt;
  -- anchor：根节点（起点经理）&lt;br /&gt;
  SELECT emp_id, manager_id, emp_name, 1 AS lvl,&lt;br /&gt;
         CAST(emp_id AS VARCHAR(200)) AS path&lt;br /&gt;
  FROM org&lt;br /&gt;
  WHERE emp_id = 100&lt;br /&gt;
&lt;br /&gt;
  UNION ALL&lt;br /&gt;
&lt;br /&gt;
  -- recursive：找当前节点的直接下属&lt;br /&gt;
  SELECT o.emp_id, o.manager_id, o.emp_name, st.lvl + 1,&lt;br /&gt;
         st.path || &amp;#039;&amp;gt;&amp;#039; || o.emp_id&lt;br /&gt;
  FROM org o&lt;br /&gt;
  JOIN sub_tree st ON o.manager_id = st.emp_id -- 语义是用 每轮迭代的新增的行（delta）JOIN基表&lt;br /&gt;
)&lt;br /&gt;
SELECT * FROM sub_tree;&lt;br /&gt;
&lt;br /&gt;
-- 防止环（脏数据或者图结构）导致A管理B、B又管理A。标准做法是用“路径”判断当前行是否访问过：&lt;br /&gt;
--  在递归成员加条件：WHERE (path不包含o.emp_id)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下为图遍历与去重策略的示例。假设边表为&amp;lt;code&amp;gt;edge(src, dst)&amp;lt;/code&amp;gt;，要找从A出发可达的点：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt; &lt;br /&gt;
WITH RECURSIVE reach(node) AS (&lt;br /&gt;
  SELECT &amp;#039;A&amp;#039;&lt;br /&gt;
  UNION     -- UNION（去重）很常见：避免图中回路导致无限扩展。每轮迭代的新增的行（delta）都会与当前累计结果集比较去重。实现可能用 hash/sort&lt;br /&gt;
  SELECT e.dst&lt;br /&gt;
  FROM edge e&lt;br /&gt;
  JOIN reach r ON e.src = r.node&lt;br /&gt;
)&lt;br /&gt;
SELECT * FROM reach;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CONNECT BY == &lt;br /&gt;
另一种可选语法是[[Oracle]]在20世纪80年代引入的非标准的 &amp;lt;code&amp;gt;CONNECT BY&amp;lt;/code&amp;gt; 结构。&amp;lt;ref&amp;gt;{{Cite book | last1 = Benedikt | first1 = M. | last2 = Senellart | first2 = P. | doi = 10.1007/978-1-4614-1168-0_10 | chapter = Databases | title = Computer Science. The Hardware, Software and Heart of It | page = 189 | year = 2011 | isbn = 978-1-4614-1167-3 | editor1-last = Blum | editor1-first = Edward K. | editor2-last =  Aho | editor2-first = Alfred V. }}&amp;lt;/ref&amp;gt; 在Oracle 10g之前，该结构仅对遍历无环图有用，因为探测到任何循环时它都会返回错误。在Oracle 10g版本中，引入了NOCYCLE特性（及关键字），使其能处理带环的数据。&amp;lt;ref name=&amp;quot;MishraBeaulieu2004&amp;quot;&amp;gt;{{cite book|author1=Sanjay Mishra|author2=Alan Beaulieu|title=Mastering Oracle SQL|url=https://books.google.com/books?id=r5vbGgz7TFsC&amp;amp;pg=PT227|year=2004|publisher=O&amp;#039;Reilly Media, Inc.|isbn=978-0-596-00632-7|page=227}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CONNECT BY&amp;lt;/code&amp;gt;的实现支持有：{{tsl|en|Snowflake Inc.|Snowflake}}、{{tsl|en|EnterpriseDB}}、&amp;lt;ref&amp;gt;[http://www.enterprisedb.com/documentation/hierarchical-queries.html Hierarchical Queries] {{Webarchive|url=https://web.archive.org/web/20080621031850/http://www.enterprisedb.com/documentation/hierarchical-queries.html |date=2008-06-21 }}, EnterpriseDB&amp;lt;/ref&amp;gt; [[Oracle数据库]]、&amp;lt;ref&amp;gt;[http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries003.htm Hierarchical Queries] {{Wayback|url=http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries003.htm |date=20111108133620 }}, Oracle&amp;lt;/ref&amp;gt; [[CUBRID]]、&amp;lt;ref&amp;gt;{{cite web|title=CUBRID Hierarchical Query|url=http://www.cubrid.org/manual/841/en/Hierarchical%20Query|access-date=11 February 2013|archive-date=14 February 2013|archive-url=https://web.archive.org/web/20130214060900/http://www.cubrid.org/manual/841/en/Hierarchical%20Query|url-status=dead}}&amp;lt;/ref&amp;gt; {{tsl|en|IBM Informix}}&amp;lt;ref&amp;gt;[https://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_2033.htm Hierarchical Clause] {{Wayback|url=https://www-01.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_2033.htm |date=20160304051159 }}, IBM Informix&amp;lt;/ref&amp;gt; 以及 [[IBM DB2]]（仅在启用兼容模式时）的支持。&amp;lt;ref name=&amp;quot;Gennick2010&amp;quot;&amp;gt;{{cite book|author=Jonathan Gennick|title=SQL Pocket Guide|url=https://books.google.com/books?id=rEAFRzMe_SMC&amp;amp;pg=PA8|year=2010|publisher=O&amp;#039;Reilly Media, Inc.|isbn=978-1-4493-9409-7|page=8|edition=3rd}}&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
语法如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
START WITH：指定层次结构的根节点。&lt;br /&gt;
&lt;br /&gt;
CONNECT BY PRIOR：定义父子之间的关联。&lt;br /&gt;
&lt;br /&gt;
ORDER SIBLINGS BY：在保持层次结构的同时，对同一层级的“兄弟”进行排序。&lt;br /&gt;
&lt;br /&gt;
SELECT select_list FROM table_expression [ WHERE ... ] [ START WITH start_expression ] CONNECT BY [NOCYCLE] { PRIOR child_expr = parent_expr | parent_expr = PRIOR child_expr } [ ORDER SIBLINGS BY column1 [ ASC | DESC ] [, column2 [ ASC | DESC ] ] ... ] [ GROUP BY ... ] [ HAVING ... ] ... &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
查询示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT LEVEL, LPAD (&amp;#039; &amp;#039;, 2 * (LEVEL - 1)) || ename &amp;quot;employee&amp;quot;, empno, mgr &amp;quot;manager&amp;quot;&lt;br /&gt;
FROM emp &lt;br /&gt;
START WITH mgr IS NULL&lt;br /&gt;
CONNECT BY PRIOR empno = mgr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上述查询的输出如下所示：&lt;br /&gt;
&lt;br /&gt;
  level |  employee   | empno | manager&lt;br /&gt;
 -------+-------------+-------+---------&lt;br /&gt;
      1 | KING        |  7839 |&lt;br /&gt;
      2 |   JONES     |  7566 |    7839&lt;br /&gt;
      3 |     SCOTT   |  7788 |    7566&lt;br /&gt;
      4 |       ADAMS |  7876 |    7788&lt;br /&gt;
      3 |     FORD    |  7902 |    7566&lt;br /&gt;
      4 |       SMITH |  7369 |    7902&lt;br /&gt;
      2 |   BLAKE     |  7698 |    7839&lt;br /&gt;
      3 |     ALLEN   |  7499 |    7698&lt;br /&gt;
      3 |     WARD    |  7521 |    7698&lt;br /&gt;
      3 |     MARTIN  |  7654 |    7698&lt;br /&gt;
      3 |     TURNER  |  7844 |    7698&lt;br /&gt;
      3 |     JAMES   |  7900 |    7698&lt;br /&gt;
      2 |   CLARK     |  7782 |    7839&lt;br /&gt;
      3 |     MILLER  |  7934 |    7782&lt;br /&gt;
 (14 rows)&lt;br /&gt;
=== 伪列 ===&lt;br /&gt;
&lt;br /&gt;
*{{mono|LEVEL}}&lt;br /&gt;
*{{mono|CONNECT_BY_ISLEAF}}&lt;br /&gt;
*{{mono|CONNECT_BY_ISCYCLE}}&lt;br /&gt;
*{{mono|CONNECT_BY_ROOT}}&lt;br /&gt;
=== 一元运算符 === &lt;br /&gt;
以下示例返回部门 10 中每个员工的姓氏、层级结构中该员工之上的每个经理、经理与员工之间的层级数，以及两者之间的路径：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  ename                           &amp;quot;Employee&amp;quot;,&lt;br /&gt;
  CONNECT_BY_ROOT ename           &amp;quot;Manager&amp;quot;,&lt;br /&gt;
  LEVEL-1                         &amp;quot;Pathlen&amp;quot;,&lt;br /&gt;
  SYS_CONNECT_BY_PATH(ename, &amp;#039;/&amp;#039;) &amp;quot;Path&amp;quot;&lt;br /&gt;
FROM emp&lt;br /&gt;
WHERE LEVEL &amp;gt; 1 AND deptno = 10&lt;br /&gt;
CONNECT BY PRIOR empno = mgr&lt;br /&gt;
ORDER BY &amp;quot;Employee&amp;quot;, &amp;quot;Manager&amp;quot;, &amp;quot;Pathlen&amp;quot;, &amp;quot;Path&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== 函数 ===&lt;br /&gt;
&amp;lt;code&amp;gt;SYS_CONNECT_BY_PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* [[Datalog]] 也实现不动点查询&lt;br /&gt;
* {{tsl|en|Regular path query|正则路径查询}}是[[图数据库]]中的一种特定递归查询&lt;br /&gt;
* {{tsl|en|Deductive database|演绎数据库}}&lt;br /&gt;
* [[层次模型]]&lt;br /&gt;
* {{tsl|en|Recursive_join|递归连接}}&lt;br /&gt;
* [[可达性]]&lt;br /&gt;
* [[传递闭包]]&lt;br /&gt;
* [[树状结构]]&lt;br /&gt;
== 参考文献 == &lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== 延伸阅读 ==&lt;br /&gt;
* {{cite book|author=C. J. Date|author-link=C. J. Date|title=SQL and Relational Theory: How to Write Accurate SQL Code|url=https://archive.org/details/sqlrelationalthe0000date_a4s2|year=2011|publisher=O&amp;#039;Reilly Media|isbn=978-1-4493-1640-2|edition=2nd|pages=[https://archive.org/details/sqlrelationalthe0000date_a4s2/page/158 159]–163}}&amp;#039;&amp;#039;&amp;#039;学术教科书&amp;#039;&amp;#039;&amp;#039;。请注意，这些仅涵盖 SQL:1999 标准（和 Datalog），不包括 Oracle 扩展。&lt;br /&gt;
* {{cite book|author1=Abraham Silberschatz|author2=Henry Korth|author3=S. Sudarshan|title=Database System Concepts|year=2010|edition=6th|publisher=McGraw-Hill|isbn=978-0-07-352332-3|pages=187–192}}&lt;br /&gt;
* {{cite book|author1=Raghu Ramakrishnan|author2=Johannes Gehrke|title=Database management systems|year=2003|publisher=McGraw-Hill|isbn=978-0-07-246563-1|edition=3rd}}第24章。&lt;br /&gt;
* {{cite book|author1=Hector Garcia-Molina|author2=Jeffrey D. Ullman|author3=Jennifer Widom|title=Database systems: the complete book|url=https://archive.org/details/databasesystemsc0000_2ndedgarc|year=2009|publisher=Pearson Prentice Hall|isbn=978-0-13-187325-4|edition=2nd|pages=[https://archive.org/details/databasesystemsc0000_2ndedgarc/page/436 437]–445}}&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* {{Cite web | title=sql - Cycle detection with recursive subquery factoring - Stack Overflow | url=https://stackoverflow.com/questions/1731889/cycle-detection-with-recursive-subquery-factoring | access-date=2026-02-04 | website=stackoverflow.com | archive-date=2020-04-14 | archive-url=https://web.archive.org/web/20200414105518/https://stackoverflow.com/questions/1731889/cycle-detection-with-recursive-subquery-factoring | dead-url=no }}&lt;br /&gt;
* {{Cite web | title=SQL Server: are the recursive CTE&amp;#039;s really set-based? at EXPLAIN EXTENDED | url=http://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/ | access-date=2026-02-04 | website=explainextended.com | archive-date=2020-08-01 | archive-url=https://web.archive.org/web/20200801005230/https://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/ | dead-url=no }}&lt;br /&gt;
* {{Cite web | title=Understanding the WITH Clause {{!}} Jonathan Gennick | url=http://gennick.com/with.html | archive-url=https://web.archive.org/web/20131114094211/http://gennick.com/with.html | archive-date=2013-11-14 | access-date=2026-02-04}}&lt;br /&gt;
* {{Cite web| title=SQL: Recursion | url=http://www.cs.duke.edu/courses/fall04/cps116/lectures/11-recursion.pdf | archive-url=https://web.archive.org/web/20050117015207/http://www.cs.duke.edu:80/courses/fall04/cps116/lectures/11-recursion.pdf | archive-date=2005-01-17}}&lt;br /&gt;
* {{Cite web | title=BlackTDN :: MSSQL Usando Consulta CTE Recursiva para montagem de Tree | url=http://www.blacktdn.com.br/2015/06/blacktdn-mssql-usando-consulta-cte.html | access-date=2026-02-04 | website=www.blacktdn.com.br | archive-date=2020-07-28 | archive-url=https://web.archive.org/web/20200728183727/http://www.blacktdn.com.br/2015/06/blacktdn-mssql-usando-consulta-cte.html | dead-url=no }}&lt;br /&gt;
&lt;br /&gt;
{{Databases}}&lt;br /&gt;
&lt;br /&gt;
[[Category:数据库管理系统]] [[Category:SQL]] [[Category:递归]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>