sql >> Databáze >  >> RDS >> Oracle

SQL Server ekvivalentní Oracle 'CONNECT BY PRIOR' a 'ORDER SIBLINGS BY'

Simulace sloupce LEVEL

Sloupec úrovně lze snadno simulovat zvýšením čítače v rekurzivní části:

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;

Simulace order siblings by

Simulace order siblings by je trochu složitější. Za předpokladu, že máme sloupec sort_order který definuje pořadí prvků na rodiče (nikoli celkové pořadí řazení – protože pak order siblings nebude nutné), pak můžeme vytvořit sloupec, který nám dá celkové pořadí řazení:

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;

Výraz pro sort_path vypadá tak složitě, protože SQL Server (alespoň verze, kterou používáte) nemá jednoduchou funkci formátování čísla s úvodními nulami. V Postgresu bych použil celočíselné pole, takže převod na varchar není nutné - ale to nefunguje ani v SQL Server.



  1. Limit velikosti MySQL VARCHAR

  2. Jak funguje parametr 'LIMIT' v sql?

  3. Importujte soubor .sql do pgadmin iii

  4. Vypočítejte počet po sobě jdoucích denních relací, které má uživatel v MySQL