sql >> Base de Datos >  >> RDS >> Oracle

SQL Server Equivalente de Oracle 'CONECTAR POR PRIOR' y 'ORDENAR HERMANOS POR'

Simulación de la columna NIVEL

La columna de nivel se puede simular fácilmente incrementando un contador en la parte recursiva:

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;

Simular order siblings by

Simulando el order siblings by es un poco más complicado. Suponiendo que tenemos una columna sort_order que define el orden de los elementos por padre (no el orden de clasificación general, porque entonces order siblings no sería necesario), entonces podemos crear una columna que nos dé un orden de clasificación general:

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;

La expresión para sort_path parece tan complicado porque SQL Server (al menos la versión que está utilizando) no tiene una función simple para formatear un número con ceros a la izquierda. En Postgres, usaría una matriz de enteros para que la conversión a varchar no es necesario, pero eso tampoco funciona en SQL Server.