Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Simulation von CONNECT BY PRIOR von Oracle in SQL Server

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.