SQL standard måde at implementere rekursive forespørgsler på, som implementeret f.eks. af IBM DB2 og SQL Server, er WITH
klausul. Se denne artikel for et eksempel på oversættelse af en CONNECT BY
ind i en WITH
(teknisk en rekursiv CTE ) -- eksemplet er til DB2, men jeg tror, det også vil fungere på SQL Server.
Rediger:tilsyneladende kræver den oprindelige querant et specifikt eksempel, her er et fra IBM-webstedet, hvis URL jeg allerede har givet. Givet en tabel:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
hvor mgrid
refererer til en medarbejders leders empid
, opgaven er, få navnene på alle, der rapporterer direkte eller indirekte til Joan
. I Oracle er det en simpel CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
I SQL Server, IBM DB2 eller PostgreSQL 8.4 (såvel som i SQL-standarden, for hvad det er værd;-), er den helt ækvivalente løsning i stedet en rekursiv forespørgsel (mere kompleks syntaks, men faktisk endnu mere kraft og fleksibilitet ):
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
Oracles START WITH
klausul bliver den første indlejrede SELECT
, grundtilfældet for rekursionen, skal være UNION
ed med den rekursive del, som bare er endnu en SELECT
.
SQL Servers specifikke variant af WITH
er naturligvis dokumenteret på MSDN, som også giver retningslinjer og begrænsninger for brugen af dette søgeord, samt flere eksempler.