sql >> Database >  >> RDS >> Sqlserver

Simulatie van CONNECT BY PRIOR van Oracle in SQL Server

De standaard SQL-manier om recursieve query's te implementeren, zoals geïmplementeerd b.v. door IBM DB2 en SQL Server, is de WITH clausule. Zie dit artikel voor een voorbeeld van het vertalen van een CONNECT BY in een WITH (technisch gezien een recursieve CTE ) -- het voorbeeld is voor DB2, maar ik denk dat het ook op SQL Server zal werken.

Bewerken:blijkbaar heeft de oorspronkelijke querant een specifiek voorbeeld nodig, hier is er een van de IBM-site waarvan ik de URL al heb gegeven. Gegeven een tafel:

CREATE TABLE emp(empid  INTEGER NOT NULL PRIMARY KEY,
                 name   VARCHAR(10),
                 salary DECIMAL(9, 2),
                 mgrid  INTEGER);

waar mgrid verwijst naar de empid . van de manager van een werknemer , de taak is om de namen te krijgen van iedereen die direct of indirect rapporteert aan Joan . In Oracle is dat een simpele CONNECT :

SELECT name 
  FROM emp
  START WITH name = 'Joan'
  CONNECT BY PRIOR empid = mgrid

In SQL Server, IBM DB2 of PostgreSQL 8.4 (evenals in de SQL-standaard, voor wat dat waard is;-), is de perfect equivalente oplossing in plaats daarvan een recursieve query (complexere syntaxis, maar eigenlijk nog meer kracht en flexibiliteit ):

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's START WITH clausule wordt de eerste geneste SELECT , het basisgeval van de recursie, te zijn UNION ed met het recursieve deel dat gewoon een andere SELECT . is .

SQL Server's specifieke smaak van WITH is natuurlijk gedocumenteerd op MSDN, dat ook richtlijnen en beperkingen geeft voor het gebruik van dit zoekwoord, evenals verschillende voorbeelden.



  1. Hoe COS() werkt in MariaDB

  2. Manieren om te weten hoe om te gaan met databasecorruptie in SQL Server

  3. Uren toevoegen aan een tijdwaarde in PostgreSQL

  4. pg_dump postgres-database van externe server wanneer poort 5432 is geblokkeerd