Funciones Recursivas.

10/11/2004 - 15:09 por Inet | Informe spam
Hola Masters como estan, tengo una duda y se las planteo a continuación:
Tengo dos tablas con la siguiente estructura:
Puntaje

IdPostulante varchar(10)
IdItem Int
Puntaje

Plantilla
IdItem Int
DescripcionItem varchar(255)
IdItemPadre

Como se puede notar Plantilla es en si donde guardo las descripciones de
cada uno de los Items a tomar en cuenta para cada Postulante, y es una tabla
en forma de arbol donde cada Item tiene un padre, en caso de que sea el
primer elemento, el mismo es su padre.
cuando ingreso los puntajes a un postulante, lo hago para cada uno de los
Items que esta en la plantilla, pero los puntajes deben ser sumarizados por
nivel, es decir por ejemplo tengo un Item que tiene 3 Items Hijos, entonces
el Puntaje que debo asignarle debe ser la suma de los hijos y asi
sucesivamente hasta tener puntajes acumulados en los Items superiores.
Habia estado pensando en una funcion recursiva o algo por el estilo, si
alguno de Uds, tiene alguna solucion se los agradeceria.

Saludos.

Ivan.
 

Leer las respuestas

#1 Gustavo Larriera [MVP]
10/11/2004 - 15:59 | Informe spam
/* pego un mensaje antiguo que habia colocado en este foro */

La recursión en SQL 2000 es una ilusión óptica :-) Deberás implementar un
algoritmo iterativo.

En SQL Server 2005 las consultas sobre datos recursivos se podrán hacer con
bastante simpleza usando las Common Table Expressions (CTE). Mientras tanto
en SQL Server 2000, hay que hacerlo manualmente. Hay muchos articulos que
explican como resolver esos temas, estos son algunos:

More Trees & Hierarchies in SQL
http://www.sqlteam.com/item.asp?ItemIDˆ66

SQL Graph Algorithms
http://willets.org/sqlgraphs.html

Representing Trees in a relational DB
http://fungus.teststation.com/~jon/treehandling/TreeHandling.htm


El siguiente algoritmo lo usé de ejemplo en una conferencia, busca
recursivamente los empleados de un determinado jefe usando la tabla
Employees de la base Northwind. Espero te sirva de inspiración.

USE northwind
GO

DECLARE @employeeMgr nchar(5)
SET @employeeMgr = '2'
DECLARE @RowsAdded int
DECLARE @reports TABLE (employeeid nchar(5) primary key, lastname
nvarchar(50) NOT NULL, reportsto nchar(5), title nvarchar(30), processed
tinyint default 0)

INSERT @reports
SELECT employeeid, lastname, reportsto, title, 0
FROM employees
WHERE employeeid = @employeeMgr

SET @RowsAdded = @@rowcount

WHILE @RowsAdded > 0
BEGIN
UPDATE @reports SET processed = 1 WHERE processed = 0

INSERT @reports
SELECT e.employeeid, e.lastname, e.reportsto, e.title, 0
FROM employees e, @reports r
WHERE e.reportsto=r.employeeid and e.reportsto <> e.employeeid and
r.processed = 1

SET @RowsAdded = @@rowcount
UPDATE @reports SET processed = 2 WHERE processed = 1
END

SELECT * FROM @reports

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.

"Inet" wrote in message
news:
Hola Masters como estan, tengo una duda y se las planteo a continuación:
Tengo dos tablas con la siguiente estructura:
Puntaje

IdPostulante varchar(10)
IdItem Int
Puntaje

Plantilla
IdItem Int
DescripcionItem varchar(255)
IdItemPadre

Como se puede notar Plantilla es en si donde guardo las descripciones de
cada uno de los Items a tomar en cuenta para cada Postulante, y es una
tabla
en forma de arbol donde cada Item tiene un padre, en caso de que sea el
primer elemento, el mismo es su padre.
cuando ingreso los puntajes a un postulante, lo hago para cada uno de los
Items que esta en la plantilla, pero los puntajes deben ser sumarizados
por
nivel, es decir por ejemplo tengo un Item que tiene 3 Items Hijos,
entonces
el Puntaje que debo asignarle debe ser la suma de los hijos y asi
sucesivamente hasta tener puntajes acumulados en los Items superiores.
Habia estado pensando en una funcion recursiva o algo por el estilo, si
alguno de Uds, tiene alguna solucion se los agradeceria.

Saludos.

Ivan.

Preguntas similares