sql >> Databáze >  >> RDS >> Sqlserver

Simulace CONNECT BY PRIOR Oracle na SQL Server

Standardní způsob SQL pro implementaci rekurzivních dotazů, jak je implementován např. od IBM DB2 a SQL Server, je WITH doložka. V tomto článku najdete jeden příklad překladu CONNECT BY do WITH (technicky rekurzivní CTE ) -- příklad je pro DB2, ale věřím, že bude fungovat i na SQL Serveru.

Edit:zřejmě původní querant vyžaduje konkrétní příklad, zde je jeden ze stránek IBM, jejichž URL jsem již uvedl. Daná tabulka:

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

kde mgrid odkazuje na empid manažera zaměstnance , úkolem je získat jména všech, kteří se přímo nebo nepřímo hlásí Joan . V Oracle je to jednoduchý CONNECT :

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

V SQL Server, IBM DB2 nebo PostgreSQL 8.4 (stejně jako ve standardu SQL, za co to stojí;-) je dokonale ekvivalentní řešení místo toho rekurzivní dotaz (složitější syntaxe, ale ve skutečnosti ještě větší výkon a flexibilita ):

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 START WITH klauzule se stane prvním vnořeným SELECT , základní případ rekurze, být UNION ed s rekurzivní částí, která je jen dalším SELECT .

Specifická varianta WITH pro SQL Server je samozřejmě zdokumentováno na webu MSDN, kde jsou také uvedeny pokyny a omezení pro použití tohoto klíčového slova a také několik příkladů.



  1. Co je rychlejší, SELECT DISTINCT nebo GROUP BY v MySQL?

  2. Představujeme novou funkci – Zpráva o růstu databáze Spotlight Cloud

  3. Použití PgBouncer Connection Pooler pro PostgreSQL s ClusterControl 1.8.2

  4. MySQL – spojení mezi databázemi na různých serverech pomocí Pythonu?