再帰クエリを実装するSQL標準の方法。 IBMDB2およびSQLServerによると、 WITH
句。 CONNECT BY
を翻訳する一例については、この記事を参照してください。 WITH
に (技術的には再帰CTE )-この例はDB2用ですが、SQLServerでも機能すると思います。
編集:どうやら元の質問者は特定の例を必要とします、これは私がすでに与えたURLを持つIBMサイトからのものです。与えられたテーブル:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
ここで、 mgrid
従業員のマネージャーのempid
を参照します 、タスクは、 Joan
に直接または間接的に報告するすべての人の名前を取得することです 。 Oracleでは、これは単純な<code> 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
OracleのSTARTWITH
句は最初のネストされたSELECT
になります 、再帰の基本ケース、 UNION
別のSELECT
である再帰部分で編集 。
SQLServer固有のWITH
のフレーバー もちろん、MSDNに文書化されており、このキーワードを使用するためのガイドラインと制限、およびいくつかの例も示されています。