Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQL Server Equivalente ao Oracle 'CONNECT BY PRIOR' e 'ORDER SIBLINGS BY'

Simulando a coluna LEVEL


A coluna de nível pode ser facilmente simulada incrementando um contador na 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;

Simulando order siblings by


Simulando o order siblings by é um pouco mais complicado. Supondo que tenhamos uma coluna sort_order que define a ordem dos elementos por pai (não a ordem geral de classificação - porque então order siblings não seria necessário), então podemos criar uma coluna que nos dá uma ordem de classificação geral:
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;

A expressão para o sort_path parece tão complicado porque o SQL Server (pelo menos a versão que você está usando) não tem uma função simples para formatar um número com zeros à esquerda. No Postgres eu usaria um array inteiro para que a conversão para varchar não é necessário - mas isso também não funciona no SQL Server.