Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL Server-Äquivalent zu Oracle „CONNECT BY PRIOR“ und „ORDER SIBLINGS BY“

Simulation der LEVEL-Spalte

Die Level-Spalte kann einfach simuliert werden, indem im rekursiven Teil ein Zähler erhöht wird:

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;

Simulieren von order siblings by

Simulation der order siblings by ist etwas komplizierter. Angenommen, wir haben eine Spalte sort_order die die Reihenfolge der Elemente pro Elternelement definiert (nicht die Gesamtsortierreihenfolge - denn dann order siblings wäre nicht notwendig), dann können wir eine Spalte erstellen, die uns eine allgemeine Sortierreihenfolge gibt:

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;

Der Ausdruck für sort_path sieht so kompliziert aus, weil SQL Server (zumindest die von Ihnen verwendete Version) keine einfache Funktion hat, um eine Zahl mit führenden Nullen zu formatieren. In Postgres würde ich ein Integer-Array verwenden, damit die Konvertierung in varchar ist nicht notwendig - aber das funktioniert auch nicht in SQL Server.