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

SQL Server equivalente di Oracle "CONNECT BY PRIOR" e "ORDER SIBLINGS BY"

Simulazione della colonna LIVELLO

La colonna del livello può essere facilmente simulata incrementando un contatore nella parte ricorsiva:

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;

Simulare order siblings by

Simulazione di order siblings by è un po' più complicato. Supponendo di avere una colonna sort_order che definisce l'ordine degli elementi per genitore (non l'ordinamento generale, perché quindi order siblings non sarebbe necessario) quindi possiamo creare una colonna che ci dia un ordinamento generale:

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'espressione per sort_path sembra così complicato perché SQL Server (almeno la versione che stai utilizzando) non ha una semplice funzione per formattare un numero con zeri iniziali. In Postgres userei un array intero in modo che la conversione in varchar non è necessario, ma non funziona nemmeno in SQL Server.