Sql Recursivo Como ?

10/04/2007 - 23:22 por Mauricio Pulla | Informe spam
Hola.

Tengo la siguiente tabla de Itemes.

Item
iItemId Int, cItemId Char(15), cDescripcion VarChar(80), iGrupo Int, iParent
Int

iItemId cItemId cDescripcion iGrupo iParent
1 01 Grupo 1 1
0
2 02 Grupo 2 1
0
3 01 Grupo 3 1
0
4 0101 SubGrupo 0101 1 1
5 0102 SubGrupo 0102 1 1
6 01010001 Item 01010001 0 4
7 010201 SubGrupo 010201 1 4
8 0102010001 Item 010201 0 7
9 0102010002 Item 010202 0 7
10 0102010003 Item 010203 0 7
11 01020101 Grupo 01020101 1 7
12 0102010101 Item 0102010101 0 11
13 01010002 Item 01010002 0 4
14 01010003 Item 01010003 0 4
15 01010004 Item 01010004 0 4
16 01010005 Item 01010005 0 4
17 0102010102 Item 0102010102 0 11

Necesito crear un sql que muestre por ejemplo el registro No.:7 y todos los
resgistro que se relacionan de forma directa e indirecta con el:

iItemId cItemId cDescripcion
7 010201 SubGrupo 010201 1 4
8 0102010001 Item 010201 0 7
9 0102010002 Item 010202 0 7
10 0102010003 Item 010203 0 7
11 01020101 Grupo 01020101 1 7
12 0102010101 Item 0102010101 0 11

17 0102010102 Item 0102010102 0 11

Seria muy facil:
Select * From Item Where substring(cItemId, 1, 4) = '010201'
Si es que la codificación seria automatica, si la codificacion se la da
manualmente o por codigo de barras ya no seria factible este sql.

Otro Sql seria
Select * From Item Where iItemId = 7
Union
Select * From Item Where iParent = 7

Pero solo traeria:

iItemId cItemId cDescripcion iGrupo iParent
7 010201 SubGrupo 010201 1 4
8 0102010001 Item 010201 0 7
9 0102010002 Item 010202 0 7
10 0102010003 Item 010203 0 7
11 01020101 Grupo 01020101 1 7

y los restantes registros tienen como iParent al registro 11 que depende del
regsitro 7
iItemId cItemId cDescripcion iGrupo iParent
12 0102010101 Item 0102010101 0 11
17 0102010102 Item 0102010102 0 11

El problema es algo complejo ya que el usuario puede crear los niveles que
creyera conveniente, y cItemId puede tener codigo de barras o caracteres que
no tengan nada que ver con el registro padre.

En todo caso espero su ayuda...

Saludos cordiales.
Mauricio Pulla
Cuenca-Ecuador
 

Leer las respuestas

#1 Javier Loria
10/04/2007 - 23:37 | Informe spam
Hola:
Si usas SQL 2005 el problema se puede resolver de forma sencilla una CTE
recursiva.
Si usas SQL 2000 es un poco mas complejo y sobre todo con un desempeño
mucho mas pobre.
Que version usas?

Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

"Mauricio Pulla" wrote in message
news:
Hola.

Tengo la siguiente tabla de Itemes.

Item
iItemId Int, cItemId Char(15), cDescripcion VarChar(80), iGrupo Int,
iParent
Int

iItemId cItemId cDescripcion iGrupo iParent
1 01 Grupo 1 1
0
2 02 Grupo 2 1
0
3 01 Grupo 3 1
0
4 0101 SubGrupo 0101 1 1
5 0102 SubGrupo 0102 1 1
6 01010001 Item 01010001 0 4
7 010201 SubGrupo 010201 1 4
8 0102010001 Item 010201 0 7
9 0102010002 Item 010202 0 7
10 0102010003 Item 010203 0 7
11 01020101 Grupo 01020101 1 7
12 0102010101 Item 0102010101 0 11
13 01010002 Item 01010002 0 4
14 01010003 Item 01010003 0 4
15 01010004 Item 01010004 0 4
16 01010005 Item 01010005 0 4
17 0102010102 Item 0102010102 0 11

Necesito crear un sql que muestre por ejemplo el registro No.:7 y todos
los
resgistro que se relacionan de forma directa e indirecta con el:

iItemId cItemId cDescripcion
7 010201 SubGrupo 010201 1 4
8 0102010001 Item 010201 0 7
9 0102010002 Item 010202 0 7
10 0102010003 Item 010203 0 7
11 01020101 Grupo 01020101 1 7
12 0102010101 Item 0102010101 0 11

17 0102010102 Item 0102010102 0 11

Seria muy facil:
Select * From Item Where substring(cItemId, 1, 4) = '010201'
Si es que la codificación seria automatica, si la codificacion se la da
manualmente o por codigo de barras ya no seria factible este sql.

Otro Sql seria
Select * From Item Where iItemId = 7
Union
Select * From Item Where iParent = 7

Pero solo traeria:

iItemId cItemId cDescripcion iGrupo iParent
7 010201 SubGrupo 010201 1 4
8 0102010001 Item 010201 0 7
9 0102010002 Item 010202 0 7
10 0102010003 Item 010203 0 7
11 01020101 Grupo 01020101 1 7

y los restantes registros tienen como iParent al registro 11 que depende
del
regsitro 7
iItemId cItemId cDescripcion iGrupo iParent
12 0102010101 Item 0102010101 0 11
17 0102010102 Item 0102010102 0 11

El problema es algo complejo ya que el usuario puede crear los niveles que
creyera conveniente, y cItemId puede tener codigo de barras o caracteres
que
no tengan nada que ver con el registro padre.

En todo caso espero su ayuda...

Saludos cordiales.
Mauricio Pulla
Cuenca-Ecuador



Preguntas similares