Die SQL-Standardmethode zur Implementierung rekursiver Abfragen, wie sie z. von IBM DB2 und SQL Server, ist der WITH
Klausel. In diesem Artikel finden Sie ein Beispiel für die Übersetzung eines CONNECT BY
in ein WITH
(technisch gesehen ein rekursiver CTE ) -- das Beispiel ist für DB2, aber ich glaube, es wird auch auf SQL Server funktionieren.
Bearbeiten:Anscheinend erfordert der ursprüngliche Abfrager ein bestimmtes Beispiel, hier ist eines von der IBM-Site, deren URL ich bereits angegeben habe. Gegeben eine Tabelle:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
wobei mgrid
verweist auf die empid
des Vorgesetzten eines Mitarbeiters , die Aufgabe besteht darin, die Namen aller Personen zu ermitteln, die Joan
direkt oder indirekt unterstellt sind . In Oracle ist das ein einfaches CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
In SQL Server, IBM DB2 oder PostgreSQL 8.4 (sowie im SQL-Standard, für was das wert ist;-) ist die vollkommen äquivalente Lösung stattdessen eine rekursive Abfrage (komplexere Syntax, aber tatsächlich noch mehr Leistung und Flexibilität). ):
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
von Oracle -Klausel wird zum ersten verschachtelten SELECT
, dem Basisfall der Rekursion, zu UNION
mit dem rekursiven Teil, der nur ein weiteres SELECT
ist .
SQL Servers spezifische Variante von WITH
ist natürlich auf MSDN dokumentiert, das auch Richtlinien und Einschränkungen für die Verwendung dieses Schlüsselworts sowie mehrere Beispiele enthält.