sql >> Database teknologi >  >> RDS >> Oracle

SQL Server-ækvivalent af Oracle 'CONNECT BY PRIOR' og 'ORDER SIBLINGS BY'

Simulering af LEVEL-kolonnen

Niveaukolonnen kan let simuleres ved at inkrementere en tæller i den rekursive del:

WITH tree (empid, name, level) AS  (
  SELECT empid, name, 1 as level
  FROM emp
  WHERE name = 'Joan'

  UNION ALL

  SELECT child.empid, child.name, parent.level + 1
  FROM emp as child
    JOIN tree parent on parent.empid = child.mgrid
)
SELECT name 
FROM tree;

Simulering af order siblings by

Simulering af order siblings by er lidt mere kompliceret. Forudsat at vi har en kolonne sort_order der definerer rækkefølgen af ​​elementer pr. forælder (ikke den overordnede sorteringsrækkefølge - for så order siblings ikke ville være nødvendigt), så kan vi oprette en kolonne, som giver os en overordnet sorteringsrækkefølge:

WITH tree (empid, name, level, sort_path) AS  (
  SELECT empid, name, 1 as level, 
         cast('/' + right('000000' + CONVERT(varchar, sort_order), 6) as varchar(max))
  FROM emp
  WHERE name = 'Joan'

  UNION ALL

  SELECT child.empid, child.name, parent.level + 1, 
         parent.sort_path + '/' + right('000000' + CONVERT(varchar, child.sort_order), 6) 
  FROM emp as child
    JOIN tree parent on parent.empid = child.mgrid
)
SELECT * 
FROM tree
order by sort_path;

Udtrykket for sort_path ser så kompliceret ud, fordi SQL Server (i hvert fald den version du bruger) ikke har en simpel funktion til at formatere et tal med foranstillede nuller. I Postgres ville jeg bruge et heltalsarray, så konverteringen til varchar er ikke nødvendigt - men det virker heller ikke i SQL Server.



  1. PostgreSQL VALUES Kommando forklaret

  2. SQL Server RAISERROR-erklæring med simple eksempler

  3. Sådan genereres INSERT-sætninger fra en forespørgsel, når du bruger SQLcl (Oracle)

  4. Postgres UPSERT genbrug kolonneværdier fra INSERT på UPDATE