Gracias a
mamcx quisiera modificar mi respuesta.
Esto lo he probado en Firebird 2.5
Código:
MENU
id
idmenup
orden -- Orden de los items de menu
usuario -- Usuario para definir diferentes menus/ordenaciones por usuario
descripcion
Indexado por (usuario, idmenup)
ID IDMENUP ORDEN USUARIO DESCRIPCION
1 0 1 1 PRINCIPAL
2 1 1 1 SUBMENU PRINCIPAL 1
3 1 2 1 SUBMENU PRINCIPAL 2
4 1 3 1 SUBMENU PRINCIPAL 3
5 0 2 1 SECUNDARIO
6 5 1 1 SUBMENU SECUNDARIO 1
7 5 2 1 SUBMENU SECUNDARIO 2
8 5 3 1 SUBMENU SECUNDARIO 3
Código SQL
[-]
WITH RECURSIVE menu_tree
as (
-- Menu ROOT es el que tiene "IDMENUP = 0"
select idmenup, id, orden, usuario, descripcion
from menu
where
idmenup = 0
UNION ALL
-- CHILD se relacionan con el padre por "PADRE.IDMENUP = ID"
select ch.idmenup, ch.id, ch.orden, ch.usuario, ch.descripcion
from menu ch
join menu_tree mt on ch.idmenup = mt.id and ch.usuario = mt.usuario)
select *
from menu_tree
where
usuario = 1
order by idmenup, orden