Consulta Recursiva de Árbol de Registros Enlazados


Se puede presentar la situación en la que dentro de una tabla de la base de datos hayan registros que están inter-relacionados, por ejemplo teniendo dentro de una  tabla la columna ID y la columna IDPadre que hace referencia a dicha colunna ID de la misma tabla para formar así un árbol de registros. Cuando llega la necesidad de consultar todos los registros descendientes de cierto padre muchas veces se recurre a .Net para realizar una función recursiva que vaya consultando por medio del árbol de registros hasta tener todos los hijos, nietos, bisnietos, etc. de un determinado padre.

Bueno, la idea es mostrar a ustedes la manera de consultar el árbol de registros haciendo uso de SQL Server.

Para ello, supongamos que tenemos una tabla para los comentarios de un foro, en donde cada comentario puede ser comentado también y debido a esto se forma un árbol de comentarios enlazados. Entonces, la estructura básica de la tabla sería como la siguiente (se pueden tener más campos, pero para el caso del ejemplo se define así):

CREATE TABLE Comentarios
(
ID Int Not Null,
IDPadre Int Not Null,
Comentario VarChar(255) Not Null
)

Ahora, poblamos la tabla con datos de prueba:

INSERT INTO Comentarios
VALUES (1, 0, ‘Comentario 1’)
INSERT INTO Comentarios
VALUES (2, 1, ‘Comentario 2 en respuesta a Comentario 1’)
INSERT INTO Comentarios
VALUES (3, 1, ‘Comentario 3 en respuesta a Comentario 1’)
INSERT INTO Comentarios
VALUES (4, 1, ‘Comentario 4 en respuesta a Comentario 1’)
INSERT INTO Comentarios
VALUES (5, 3, ‘Comentario 5 en respuesta a Comentario 3’)
INSERT INTO Comentarios
VALUES (6, 3, ‘Comentario 6 en respuesta a Comentario 3’)

Al consultar la tabla de comentarios obtenemos la siguiente información:

Consulta Tabla

Como se puede observar el comentario con ID 1 es padre de los comentarios 2, 3, 4 directamente, pero debido a que es padre del comentario con ID 3 y este comentario es padre de los comentarios con ID 5 y 6, entonces estos dos comentarios tienen como padre también al comentario con ID 1. Entonces al querer sacar los descendientes del comentario con ID 1, la consulta nos debe devolver los comentarios con ID 2, 3, 4, 5 y 6.

Ya teniendo datos, procedemos a realizar la consulta SQL. Para ello entonces hacemos uso de una CTE para usarla como base para recursivamente sacar los comentarios descendientes de cierto padre.

La consulta quedaría de la siguiente manera:

WITH ComentariosDescendientes(ID, IDPadre, Comentario, Nivel) AS
(
SELECT ID, IDPadre, Comentario, 0
FROM Comentarios
WHERE IDPadre = 1
UNION ALL
SELECT c.ID, c.IDPadre, c.Comentario, Nivel + 1
FROM Comentarios c INNER JOIN ComentariosDescendientes cd
ON c.IDPadre = cd.ID
)

SELECT ID, IDPadre, Comentario, Nivel
FROM ComentariosDescendientes

Dentro de la CTE lo primero que se realiza es la consulta de la tabla “Comentarios” filtrando por el Id del padre que queremos consultar, en este caso el padre con ID 1; esto nos devuelve todos los registros que tienen en la columna IDPadre el valor 1 (cabe anotar que estos registros son parte de la ejecucion interna de la CTE y que solo para efectos del ejemplo muestro lo que la CTE debe obtener de esta primer consulta):

Hijos directos de padre

Seguido de esto hay un UNION ALL con otra consulta que se encarga de usar estos registros y unirlos con la tabla “Comentarios” para ir sacando los registros hijos por cada uno de los registros ya listados (los registros con ID 2, 3 y 4). De esta manera el CTE se encarga de sacar los hijos de cada uno de los registros que previamente han sido listados, y así sucesiavmente por cada registro se obtienen los hijos. Por eso es clave la primer consulta dentro del CTE ya que obtiene los hijos directos del padre que se quiere consultar, para que a partir de estos se obtengan todos los registros del árbol. El resultado de la consulta completa es el siguiente:

Registros descendientes del padre consultado

 

Anuncios

22 comentarios sobre “Consulta Recursiva de Árbol de Registros Enlazados

    1. Muy buen día, antes que nada mil disculpas por la demora, esta es la solución a la inquietud presentada:

      WITH ComentariosPadres(ID, IDPadre, Comentario, Nivel) AS
      (
      SELECT ID, IDPadre, Comentario, 0
      FROM Comentarios
      WHERE ID = (SELECT IDPadre FROM Comentarios Where ID = 6)
      UNION ALL
      SELECT c.ID, c.IDPadre, c.Comentario, Nivel + 1
      FROM Comentarios c INNER JOIN ComentariosPadres cp
      ON c.ID = cp.IDPadre
      )

      SELECT ID, IDPadre, Comentario, Nivel
      FROM ComentariosPadres

      En la anterior consulta obtenemos toda la cadena de padres del registro con ID 6. Espero sea de ayuda.

      Me gusta

      1. Disculpa y si lo que me interesa es solo saber los IDPadre como seria la consulta por mas que intento me salen padres e hijos

        Me gusta

      2. Hola Aidee. Pienso que la consulta de obtener los padres de un determinado hijo te puede ser útil. La consulta está en la respuesta que le dí al usuario Pit.

        Me gusta

  1. Hola me fue de ayuda tu pos pero tengo una duda que pasaría si sucediera este ejemplo :
    *****************************************************************
    CategID * Nombre_categ * CategPadreID *
    ****************************************************************
    A01 * Ropa * 0000000-00001 *
    A02 * Lubricantes * 0000000-00001 *
    A03 * Camisa * A01 *
    A04 * Marca Repsol * A02 *
    A05 * pantalon * A01 *
    A06 * correa * A01 *
    A07 * Marca Primax * A02 *
    *****************************************************************
    Como se listaria poniendo los campos
    Nombre_categoria Sub_categoria
    Ropa Camisa
    pantalon
    Correa
    Lubricantes Marca Repsol
    Marca Primax

    Pero de mas de 100 items o data ?? y que tambien
    pueda aver o poner un Sub_categoria1 o 2 dependiendo
    se podria hacer con recursividad

    Me gusta

    1. Hola Jose,

      He estado revisando el escenario que planteas pero es complejo, la posibilidad que veo es que uses un pivot para transformar las subcategorías en columnas pero debes agregar bastante lógica para poder obtener el resultado que esperas.

      Me gusta

  2. hola tengo un caso parecido a este tipo de consulta pero yo quiero saber de toda la tabla los datos con sus respectivos hijos algo asi:

    mi estructura de la tabla es la siguiente
    CREATE TABLE [dbo].[SegMenus](
    [Id_Menu] [int] NOT NULL,
    [Id_MenuPadre] [int] NULL,
    [DescripcionMenu] [varchar](255) NOT NULL,
    [PosicionMenu] [int] NOT NULL,
    [HabilitadoMenu] [bit] NOT NULL,
    [UrlMenu] [varchar](255) NULL,
    CONSTRAINT [PK_SegMenus] PRIMARY KEY CLUSTERED
    (
    [Id_Menu] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (1, 0, N’Seguridad’, 5, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (2, 1, N’Usuarios’, 1, 1, N’FrmManUsuariosH’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (3, 1, N’Perfiles’, 2, 1, N’FrmManperfiles’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (4, 0, N’Requisiciones’, 1, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (5, 4, N’Empresas’, 1, 1, N”)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (6, 5, N’Creacion’, 1, 1, N’FrmManEmpresas’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (7, 4, N’Clientes’, 2, 1, N”)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (8, 7, N’Creacion’, 1, 1, N’FrmManClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (9, 7, N’Costo Clientes Externos’, 2, 1, N’FrmCostoClientesExternos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (10, 7, N’Restricciones’, 3, 1, N’FrmManRestriccionesR’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (11, 7, N’Consulta Restricciones’, 4, 1, N’FrmConsultaRestricciones’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (12, 7, N’Fecha Despacho Mega Pan’, 5, 1, N’FrmPlanDespacho’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (13, 7, N’Adiciones’, 6, 1, N’FrmManAdiciones’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (14, 4, N’Requisiciones’, 3, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (15, 14, N’Menu’, 1, 1, N’FrmReqMenu’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (16, 14, N’Plato’, 2, 1, N’FrmReqPlato’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (17, 14, N’Producto’, 3, 1, N’FrmReqProducto’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (18, 14, N’Listado Requisiciones FR’, 4, 1, N’FrmListadoRequisiciones’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (19, 14, N’Listado Requisiciones FD’, 5, 1, N’FrmListadoRequisicionesDespacho’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (20, 4, N’Disminuciones’, 4, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (21, 20, N’Menu’, 1, 1, N’FrmDisMenu’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (22, 20, N’Plato’, 2, 1, N’FrmDisPlato’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (23, 20, N’Producto’, 3, 1, N’FrmDisProducto’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (24, 20, N’Listado Disminuciones FR’, 4, 1, N’FrmListadoDisminuciones’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (25, 4, N’Condensado’, 5, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (26, 25, N’Generacion’, 1, 1, N’FrmGenerarPedidos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (27, 25, N’Pedidos Guardados’, 2, 1, N’FrmPedidosGuardados’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (28, 25, N’Listado de Pedidos’, 3, 1, N’FrmPedidoProveedor’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (29, 4, N’Parametros’, 6, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (30, 29, N’Grupos por Clientes’, 1, 1, N’FrmManParametros’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (31, 29, N’Dias de Despacho’, 2, 1, N’FrmDiasDespacho’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (32, 29, N’Clases Clientes’, 3, 1, N’FrmManClasesClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (33, 29, N’Provincias/Ciudades’, 4, 1, N’FrmProvincia_Ciudad’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (34, 29, N’Generar Semanas Reportes Servicios’, 5, 1, N’FrmManGenerarSemanas’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (35, 4, N’Reportes’, 7, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (36, 35, N’Productos Pedido por Cliente’, 1, 1, N’FrmProdPedidosporCliente’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (37, 35, N’Productos Extras Facturacion’, 2, 1, N’FrmListadoProductosExtrasFacturacionClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (38, 35, N’Megapan por Dia’, 3, 1, N’FrmListadoPlatosCliente’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (39, 35, N’Acumulados Egresos Por Producto’, 4, 1, N’FrmListadoEgresosAcumuladoClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (40, 35, N’Acumulado Devoluciones por Producto’, 5, 1, N’FrmListadoDevAcumuladoClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (41, 35, N’Impresion Previa Mega Pan’, 6, 1, N’FrmRptEgresoProductosMegaPan’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (43, 0, N’Menus y Recetas’, 3, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (44, 43, N’Menus’, 1, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (45, 44, N’Creacion Menú’, 1, 1, N’FrmManMenu’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (46, 44, N’Gestión Menú’, 2, 1, N’FrmManMenus’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (47, 7, N’Semanas Menú’, 8, 1, N’FrmManSemanasMenus’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (48, 44, N’Menú Base’, 4, 1, N’FrmMenuBase’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (49, 43, N’Platos’, 2, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (50, 49, N’Agrupaciones’, 1, 1, N’FrmManAgrupacionesPlatos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (51, 49, N’Servicios y Opciones’, 2, 1, N’FrmManServicios_OpcionesPlato’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (52, 49, N’Platos’, 3, 1, N’FrmManPlatos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (53, 43, N’Recetas’, 3, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (54, 53, N’Creación’, 1, 1, N’FrmManRecetas’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (55, 53, N’Consultar Costos de Plato’, 2, 1, N’FrmRecetasCosto’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (56, 0, N’Abastecimiento’, 3, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (57, 56, N’Proveedores’, 1, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (58, 57, N’Creacion’, 1, 1, N’FrmManProveedores’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (59, 0, N’Inventarios’, 4, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (60, 59, N’Productos’, 1, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (61, 60, N’Agrupaciones’, 1, 1, N’FrmManAgrupaciones’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (62, 60, N’Virtuales’, 2, 1, N’FrmManProductosVirtuales’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (63, 60, N’Reales’, 3, 1, N’FrmManProductos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (64, 60, N’Asignación PR aPV’, 4, 1, N’FrmManRecetasPV’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (66, 60, N’Despachadores’, 6, 1, N’FrmManDespachador’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (67, 60, N’Impresión Etiquetas’, 7, 1, N’FrmImpresionEtiquetas1′)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (68, 59, N’Ingresos de Bodega’, 2, 1, N”)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (69, 68, N’Ingresos’, 1, 1, N’FrmIngresoBodega’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (74, 68, N’Listado Ingreso de Bodega’, 3, 1, N’FrmListadoIngresoBodega’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (76, 68, N’Ingresos Manuales’, 5, 1, N’FrmIngresoBodegaManual’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (77, 59, N’Egresos de bodega’, 3, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (82, 77, N’Forzar Proceso Egreso’, 2, 1, N’FrmPreEgreso’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (83, 77, N’Listado Egresos de Bodega’, 3, 1, N’FrmListadoEgresoBodega’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (85, 77, N’Egreso por Despachador’, 5, 1, N’FrmEgresoBodegaAlmacenamientoPre’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (86, 77, N’Egresos Manuales’, 6, 1, N’FrmEgresoBodegaManual’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (87, 59, N’Registro Inventario’, 4, 1, N’FrmInventarioFisico’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (88, 59, N’Devoluciones Clientes’, 5, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (89, 88, N’Registro ‘, 1, 1, N’FrmDevolucionClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (92, 88, N’Listado’, 2, 1, N’FrmListadoDevClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (93, 59, N’Devolución Proveedores’, 6, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (94, 93, N’Registro’, 1, 1, N’FrmDevolucionProveedores’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (95, 93, N’Listado’, 2, 1, N’FrmDevolucionListadoProveedores’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (96, 59, N’Reportes’, 7, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (97, 96, N’Kardex por Producto’, 1, 1, N’FrmRptKardex’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (98, 96, N’Inventario Final’, 2, 1, N’FrmRptInventario’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (99, 59, N’Faltantes IB’, 8, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (100, 99, N’Consulta Individual’, 1, 1, N’FrmFaltanteIngresos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (101, 99, N’Listado’, 2, 1, N’FrmListadoFaltantesIngresoProveedores’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (102, 59, N’Faltantes EB’, 9, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (103, 102, N’Consulta Individual’, 1, 1, N’FrmFaltanteEgresos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (104, 102, N’Listado’, 2, 1, N’FrmListadoFaltantesEgresoClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (105, 59, N’Ventas’, 10, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (106, 105, N’Registro’, 1, 1, N’FrmVentas’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (107, 105, N’Listado’, 2, 1, N’FrmListadoVentas’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (108, 59, N’Bajas’, 11, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (109, 108, N’Registro’, 1, 1, N’FrmBajadeProductos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (110, 108, N’Listado’, 2, 1, N’FrmListadoBajas’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (111, 1, N’Cambio Clave’, 3, 1, N’FrmCambioClave’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (112, 20, N’Listado Disminuciones FD’, 5, 1, N’FrmListadoDisminucionesDespacho’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (113, 20, N’Disminuciones por Semana’, 6, 1, N’FrmDisminucionesPorSemana’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (114, 20, N’Modifica Disminucion Producto’, 7, 1, N’FrmModificarDisProducto’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (115, 14, N’Modifica Requisicion por Producto’, 6, 1, N’FrmModificarReqProducto’)
    GO
    print ‘Processed 100 total records’
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (116, 59, N’Sobrantes’, 12, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (117, 116, N’Consulta Individual’, 1, 1, N’FrmSobranteIngresos’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (118, 116, N’Listado’, 2, 1, N’FrmListadoSobrantes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (119, 96, N’Consulta PreEgreso’, 3, 1, N’FrmConsultarPreEgreso’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (120, 96, N’Consulta PreEgreso Acumulado’, 4, 1, N’FrmConsultarPreEgresoAcumulado’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (121, 96, N’Consulta Egreso Acumulado’, 5, 1, N’FrmImpresionEgresoAcumulado’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (123, 60, N’Asignacion Despachadores a Usuarios’, 8, 1, N’FrmAccesoUsuarios’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (124, 59, N’IC’, 13, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (125, 124, N’Consulta Individual’, 1, 1, N’FrmIC’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (126, 124, N’Listado’, 2, 1, N’FrmListadoIC’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (127, 14, N’Requisiciones por Semana’, 7, 1, N’FrmRequisicionesPorSemana’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (128, 1, N’Mantenimiento Parametros’, 4, 1, N’FrmParametrosSeguridad’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (129, 25, N’Consulta Condensado’, 4, 1, N’FrmConsultaCondensado’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (130, 88, N’Consulta Individual’, 3, 1, N’FrmConsultaIDevolucionClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (131, 14, N’Actualiza Fechas de Servicio’, 8, 1, N’FrmActualizaFechasServicio’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (132, 35, N’Consulta Ultimo Despacho por Producto’, 7, 1, N’FrmConsultaUltimoEgreso’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (133, 96, N’Disminucion Condensado’, 6, 1, N’FrmConConsolidadoHistorial’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (134, 7, N’Costos Clientes’, 7, 1, N’FrmAdminClientes’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (135, 59, N’CP’, 14, 1, NULL)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (136, 135, N’Consulta Individual’, 1, 1, N’FrmCP’)
    INSERT [dbo].[SegMenus] ([Id_Menu], [Id_MenuPadre], [DescripcionMenu], [PosicionMenu], [HabilitadoMenu], [UrlMenu]) VALUES (137, 135, N’Listado’, 2, 1, N’FrmListadoCP’)

    Me gusta

    1. Hola Henry,

      La consulta quedaría de la siguiente manera:

      WITH ArbolMenu(Id_Menu, Id_MenuPadre, DescripcionMenu, PosicionMenu, HabilitadoMenu, UrlMenu, Nivel) AS
      (
      SELECT Id_Menu, Id_MenuPadre, DescripcionMenu, PosicionMenu, HabilitadoMenu, UrlMenu, 0
      FROM SegMenus
      WHERE Id_MenuPadre = 0
      UNION ALL
      SELECT sm.Id_Menu, sm.Id_MenuPadre, sm.DescripcionMenu, sm.PosicionMenu, sm.HabilitadoMenu, sm.UrlMenu, Nivel + 1
      FROM SegMenus sm INNER JOIN ArbolMenu am
      ON sm.Id_MenuPadre = am.Id_Menu
      )

      SELECT Id_Menu, Id_MenuPadre, DescripcionMenu, PosicionMenu, HabilitadoMenu, UrlMenu, Nivel
      FROM ArbolMenu

      Hay que tener en cuenta que en la consulta top del “UNION ALL” el “WHERE” debe filtrar a los registros de nivel 0, es decir, aquellos que no tienen padre, de manera que sean la base para que el “INNER JOIN” empiece el recorrido de todos los descendientes respectivos.

      Me gusta

  3. WITH ComentariosDescendientes(Id_Menu, Id_MenuPadre, DescripcionMenu, PosicionMenu, HabilitadoMenu, UrlMenu, Nivel) AS (SELECT Id_Menu, Id_MenuPadre,
    DescripcionMenu, PosicionMenu,
    HabilitadoMenu, UrlMenu,
    0 AS Expr1
    FROM dbo.SegMenus
    WHERE (Id_MenuPadre = 0)
    UNION ALL
    SELECT c.Id_Menu, c.Id_MenuPadre,
    c.DescripcionMenu,
    c.PosicionMenu, c.HabilitadoMenu,
    c.UrlMenu,
    cd.Nivel + 1 AS Expr1
    FROM dbo.SegMenus AS c INNER JOIN
    ComentariosDescendientes AS cd ON
    c.Id_MenuPadre = cd.Id_Menu)
    SELECT TOP (100) PERCENT Id_Menu, Id_MenuPadre, DescripcionMenu, PosicionMenu, HabilitadoMenu, UrlMenu
    FROM ComentariosDescendientes AS ComentariosDescendientes_1
    GROUP BY Id_Menu, Id_MenuPadre, DescripcionMenu, PosicionMenu, HabilitadoMenu, UrlMenu

    Me gusta

  4. pero la idea es agrupar los datos del ID_MenuPadre algo asi
    Id Id_MP Descripcion Posi Hab Urlform
    1 0 Seguridad 5 1 NULL
    2 1 Usuarios 1 1 FrmManUsuariosH
    3 1 Perfiles 2 1 FrmManperfiles
    111 1 Cambio Clave 3 1 FrmCambioClave
    128 1 Mantenimiento Parametros 4 1 FrmParametrosSeguridad
    4 0 Requisiciones 1 1 NULL
    5 4 Empresas 1 1
    6 5 Creacion 1 1 FrmManEmpresas
    7 4 Clientes 2 1
    8 7 Creacion 1 1 FrmManClientes
    9 7 Costo Clientes Externos 2 1 FrmCostoClientesExternos
    10 7 Restricciones 3 1 FrmManRestriccionesR
    11 7 Consulta Restricciones 4 1 FrmConsultaRestricciones
    12 7 Fecha Despacho Mega Pan 5 1 FrmPlanDespacho
    13 7 Adiciones 6 1 FrmManAdiciones

    Me gusta

  5. Hola, Muchas gracias por la información, ha sido de mucha ayuda. ¿Cómo quedaría la consulta si quiero adherir al resultado el registro que utilizo como referencia?
    Saludos

    Me gusta

    1. Hola Carlos, puedes poner en vez del id padre el id del registro que usas como referencia, de esa manera queda dentro del resultado y a partir de este es que se realiza la consulta recursiva.

      Me gusta

  6. La consulta me arroja solo dos niveles de resultado, es decir, la consulta esta de la siguiente forma:

    WITH ComentariosDescendientes([IdArbol], [IdArbol_Padre], [DescripcionArbol], Nivel) AS
    (
    SELECT [IdArbol], [IdArbol_Padre], [DescripcionArbol], 0
    FROM [dbo].[Arboles]
    WHERE [IdArbol] = (SELECT [IdArbol_Padre] FROM [dbo].[Arboles] Where [IdArbol] = 6)
    UNION ALL
    SELECT c.[IdArbol], c.[IdArbol_Padre], c.[DescripcionArbol], Nivel + 1
    FROM [dbo].[Arboles] c INNER JOIN ComentariosDescendientes cd
    ON c.[IdArbol_Padre] = cd.[IdArbol]
    )

    SELECT [IdArbol], [IdArbol_Padre], [DescripcionArbol], Nivel
    FROM ComentariosDescendientes

    y el resultado es el registro del [IdArbol] = 6 y el registro de su [IdArbol_Padre] el cual es igual a 5, es decir, el resultado es:

    IdArbol IdArbol_Padre DescripcionArbol Nivel
    5 4 No Supra 0
    6 5 Nacional 1

    Me gusta

      1. Gracias, indagando encontré que la clave esta en la siguiente linea:

        — obtener datos de forma descendente
        ON c.[IdArbol_Padre] = cd.[IdArbol]

        — obtener datos de forma ascendente
        ON c.[IdArbol] = cd.[IdArbol_Padre]

        Espero les sirva.

        Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s