实现递归查询的 SQL 标准方法,例如实现的通过 IBM DB2 和SQL服务器 http://msdn.microsoft.com/en-us/library/ms186243.aspx, 是个WITH
条款。看本文 http://www.ibm.com/developerworks/db2/library/techarticle/dm-0510rielau/举一个翻译 a 的例子CONNECT BY
into a WITH
(从技术上讲递归CTE) -- 该示例适用于 DB2,但我相信它也适用于 SQL Server。
编辑:显然原始查询者需要一个特定的示例,这是来自 IBM 站点的一个示例,我已经给出了该站点的 URL。给定一个表:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
where mgrid
引用员工经理的empid
,任务是,获取直接或间接向其报告的每个人的姓名Joan
。在 Oracle 中,这很简单CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
在 SQL Server、IBM DB2 或 PostgreSQL 8.4(以及 SQL 标准,无论其价值如何;-)中,完全等效的解决方案是递归查询(语法更复杂,但实际上更强大、更灵活) ):
WITH n(empid, name) AS
(SELECT empid, name
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT nplus1.empid, nplus1.name
FROM emp as nplus1, n
WHERE n.empid = nplus1.mgrid)
SELECT name FROM n
甲骨文的START WITH
子句成为第一个嵌套SELECT
,递归的基本情况是UNION
与递归部分一起编辑,这只是另一个SELECT
.
SQL Server 的特定风格WITH
当然记录在MSDN http://msdn.microsoft.com/en-us/library/ms175972(SQL.90).aspx,其中还提供了使用此关键字的指南和限制,以及几个示例。