sql >> Database teknologi >  >> RDS >> Sqlserver

Simulering af CONNECT BY PRIOR af Oracle i SQL Server

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.



  1. SQL Pivot med flere kolonner

  2. Gruppér DateTime i 5,15,30 og 60 minutters intervaller

  3. PIVOT-forespørgsel på distinkte poster

  4. ) Operatør for begyndere