Oracle
 sql >> Base de données >  >> RDS >> Oracle

Équivalent SQL Server d'Oracle 'CONNECT BY PRIOR' et 'ORDER SIBLINGS BY'

Simulation de la colonne LEVEL

La colonne de niveau peut facilement être simulée en incrémentant un compteur dans la partie récursive :

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;

Simuler order siblings by

Simulation de la order siblings by est un peu plus compliqué. En supposant que nous ayons une colonne sort_order qui définit l'ordre des éléments par parent (et non l'ordre de tri global - car alors order siblings ne serait pas nécessaire) alors nous pouvons créer une colonne qui nous donne un ordre de tri global :

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;

L'expression pour le sort_path semble si compliqué car SQL Server (au moins la version que vous utilisez) n'a pas de fonction simple pour formater un nombre avec des zéros non significatifs. Dans Postgres, j'utiliserais un tableau d'entiers pour que la conversion en varchar n'est pas nécessaire - mais cela ne fonctionne pas non plus dans SQL Server.