Tabla recursiva (2009-10-08)

08/10/2009 - 12:57 por Mauricio | Informe spam
Hola a todos,
tengo esta tabla:
CREATE TABLE [dbo].[PROYECTOS](
[IDProyecto] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
[Comentario] [varchar](5000) NULL,
[IdPadre] [int] NOT NULL,
[Nivel] [tinyint] NULL,
[IdUsuario] [int] NULL,
[Fecha] [datetime] NULL,
[Mojon] [tinyint] NULL,
[NUMEROHISTORIA] [int] NULL,
[NoEnviarNotificacionesVCS] [tinyint] NULL,
[NoEnviarNotificacionesITS] [tinyint] NULL,
CONSTRAINT [PK_PROYECTOS] PRIMARY KEY CLUSTERED
(
[IDProyecto] 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

Es recursiva, con una relación entre IdProyecto e IdPadre.
Representa un árbol, con sub-proyectos colgando de un proyecto
principal, y puede tener n niveles.
Necesito hacer una vista o un procedimiento almacenado que me
devuelva la tabla ordenada alfábeticamente por proyectos y
sub-proyectos, y la verdad es que no se me ocurre cómo.
Ejemplo:
MCS
Dlls
Libs
Others
Planwin
Images
Bmps
Jpgs
Pngs
Scripts

Cualquier idea es bienvenida.
Gracias.

Mauricio
Copenhague, Dinamarca

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
08/10/2009 - 13:23 | Informe spam
Con CTE recursivas. Echa un vistazo a
http://msdn.microsoft.com/es-es/lib...90%29.aspx

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"Mauricio" wrote in message
news:
Hola a todos,
tengo esta tabla:
CREATE TABLE [dbo].[PROYECTOS](
[IDProyecto] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
[Comentario] [varchar](5000) NULL,
[IdPadre] [int] NOT NULL,
[Nivel] [tinyint] NULL,
[IdUsuario] [int] NULL,
[Fecha] [datetime] NULL,
[Mojon] [tinyint] NULL,
[NUMEROHISTORIA] [int] NULL,
[NoEnviarNotificacionesVCS] [tinyint] NULL,
[NoEnviarNotificacionesITS] [tinyint] NULL,
CONSTRAINT [PK_PROYECTOS] PRIMARY KEY CLUSTERED
(
[IDProyecto] 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

Es recursiva, con una relación entre IdProyecto e IdPadre. Representa un
árbol, con sub-proyectos colgando de un proyecto principal, y puede tener
n niveles.
Necesito hacer una vista o un procedimiento almacenado que me devuelva
la tabla ordenada alfábeticamente por proyectos y sub-proyectos, y la
verdad es que no se me ocurre cómo.
Ejemplo:
MCS
Dlls
Libs
Others
Planwin
Images
Bmps
Jpgs
Pngs
Scripts

Cualquier idea es bienvenida.
Gracias.

Mauricio
Copenhague, Dinamarca


Respuesta Responder a este mensaje
#2 Alejandro Mesa
08/10/2009 - 15:24 | Informe spam
Mauricio,

Crees que puedas postear data de ejemplo en forma de sentencias insert?

Como comento Carlos, podemos usar una CTE recursiva. El truco (el cual
aprendi de Itzik Ben-Gan) esta en la ordenacion.

Aca tines un ejemplo que usa la jerarquia de empleados en la base de datos
"Northwind". Si tienes problemas adaptandola a tu ambiente, dejame saber para
poder ayudarte.


USE Northwind;
GO

WITH EmpH AS (
SELECT
EmployeeID,
LastName,
FirstName,
0 AS lvl,
CAST(0 AS varbinary(900)) AS OrderCol
FROM
dbo.Employees
WHERE
ReportsTo IS NULL

UNION ALL

SELECT
C.EmployeeID,
C.LastName,
C.FirstName,
P.lvl + 1,
CAST(P.OrderCol + CAST(ROW_NUMBER() OVER(PARTITION BY C.ReportsTo ORDER BY
C.LastName, C.FirstName) AS BINARY(4)) AS varbinary(900))
FROM
EmpH AS P
INNER JOIN
dbo.Employees AS C
ON P.EmployeeID = C.ReportsTo
)
SELECT
LEFT(REPLICATE('| ', lvl * 4) + LastName + ', ' + FirstName, 35) AS
EmployeeName,
lvl
FROM
EmpH
ORDER BY
OrderCol;
GO


Si estas interesado en aprendar mucho de lo relacionado con esta teoria,
entonces te recomiendo el sgte libro.

Inside Microsoft® SQL Server® 2008: T-SQL Queryin
http://www.amazon.com/gp/product/07...mp;pf_rd_t 1&pf_rd_i35623139&pf_rd_m=ATVPDKIKX0DER&pf_rd_rH6ASCE1CMG7717QMPF


AMB


"Mauricio" wrote:

Hola a todos,
tengo esta tabla:
CREATE TABLE [dbo].[PROYECTOS](
[IDProyecto] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
[Comentario] [varchar](5000) NULL,
[IdPadre] [int] NOT NULL,
[Nivel] [tinyint] NULL,
[IdUsuario] [int] NULL,
[Fecha] [datetime] NULL,
[Mojon] [tinyint] NULL,
[NUMEROHISTORIA] [int] NULL,
[NoEnviarNotificacionesVCS] [tinyint] NULL,
[NoEnviarNotificacionesITS] [tinyint] NULL,
CONSTRAINT [PK_PROYECTOS] PRIMARY KEY CLUSTERED
(
[IDProyecto] 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

Es recursiva, con una relación entre IdProyecto e IdPadre.
Representa un árbol, con sub-proyectos colgando de un proyecto
principal, y puede tener n niveles.
Necesito hacer una vista o un procedimiento almacenado que me
devuelva la tabla ordenada alfábeticamente por proyectos y
sub-proyectos, y la verdad es que no se me ocurre cómo.
Ejemplo:
MCS
Dlls
Libs
Others
Planwin
Images
Bmps
Jpgs
Pngs
Scripts

Cualquier idea es bienvenida.
Gracias.

Mauricio
Copenhague, Dinamarca



Respuesta Responder a este mensaje
#3 Mauricio
08/10/2009 - 16:57 | Informe spam
Gracias Carlos y Alejandro por sus respuestas. Voy a ver qué sale y si
no logro hacerlo, pido ayuda de nuevo. :)
Saludos.

Alejandro Mesa a formulé la demande :
Mauricio,

Crees que puedas postear data de ejemplo en forma de sentencias insert?

Como comento Carlos, podemos usar una CTE recursiva. El truco (el cual
aprendi de Itzik Ben-Gan) esta en la ordenacion.

Aca tines un ejemplo que usa la jerarquia de empleados en la base de datos
"Northwind". Si tienes problemas adaptandola a tu ambiente, dejame saber para
poder ayudarte.


USE Northwind;
GO

WITH EmpH AS (
SELECT
EmployeeID,
LastName,
FirstName,
0 AS lvl,
CAST(0 AS varbinary(900)) AS OrderCol
FROM
dbo.Employees
WHERE
ReportsTo IS NULL

UNION ALL

SELECT
C.EmployeeID,
C.LastName,
C.FirstName,
P.lvl + 1,
CAST(P.OrderCol + CAST(ROW_NUMBER() OVER(PARTITION BY C.ReportsTo ORDER BY
C.LastName, C.FirstName) AS BINARY(4)) AS varbinary(900))
FROM
EmpH AS P
INNER JOIN
dbo.Employees AS C
ON P.EmployeeID = C.ReportsTo
)
SELECT
LEFT(REPLICATE('| ', lvl * 4) + LastName + ', ' + FirstName, 35) AS
EmployeeName,
lvl
FROM
EmpH
ORDER BY
OrderCol;
GO


Si estas interesado en aprendar mucho de lo relacionado con esta teoria,
entonces te recomiendo el sgte libro.

Inside Microsoft® SQL Server® 2008: T-SQL Querying
http://www.amazon.com/gp/product/07...mp;pf_rd_t 1&pf_rd_i35623139&pf_rd_m=ATVPDKIKX0DER&pf_rd_rH6ASCE1CMG7717QMPF


AMB


"Mauricio" wrote:

Hola a todos,
tengo esta tabla:
CREATE TABLE [dbo].[PROYECTOS](
[IDProyecto] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
[Comentario] [varchar](5000) NULL,
[IdPadre] [int] NOT NULL,
[Nivel] [tinyint] NULL,
[IdUsuario] [int] NULL,
[Fecha] [datetime] NULL,
[Mojon] [tinyint] NULL,
[NUMEROHISTORIA] [int] NULL,
[NoEnviarNotificacionesVCS] [tinyint] NULL,
[NoEnviarNotificacionesITS] [tinyint] NULL,
CONSTRAINT [PK_PROYECTOS] PRIMARY KEY CLUSTERED
(
[IDProyecto] 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

Es recursiva, con una relación entre IdProyecto e IdPadre.
Representa un árbol, con sub-proyectos colgando de un proyecto
principal, y puede tener n niveles.
Necesito hacer una vista o un procedimiento almacenado que me
devuelva la tabla ordenada alfábeticamente por proyectos y
sub-proyectos, y la verdad es que no se me ocurre cómo.
Ejemplo:
MCS
Dlls
Libs
Others
Planwin
Images
Bmps
Jpgs
Pngs
Scripts

Cualquier idea es bienvenida.
Gracias.

Mauricio
Copenhague, Dinamarca








Mauricio
Copenhague, Dinamarca
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida