hacer join a un campo con varios valores

26/11/2006 - 12:09 por Crhisthian | Informe spam
Hola, como estas, tengo una duda con SQL ojala y me ayudaran.
como puedo hacer esta operacion:
Tengo dos tablas:
Articulos(ID,EAN,DESCRIPCION,FAMILIA)
Secciones(ID,DESCRIPCION,FAMILIAS(CHAR))
Cada articulo tiene una familia, y las secciones pueden tener varias
familias, ejemplo

Seccion:
1,COMESTIBLES,'1|5|12|19'
si hago un :
Select art.descripcion,sec.descripcion from articulos as art
inner join secciones as sec on art.familia in (replace(sec.familias,'|',','))

me da un error ya que el resultado de replace(sec.familias,'|',',') es un
char y devlueve '1,5,12,19' cuando deberia ser '1','5','12','19' . la verdad
es que yo ya he resueltoeste problema con un charindex, pero la consulta
demora demasiado, aunque al final si funciona, alguno de ustedes sabe si hay
otra manera de hacerlo.
Gracias...
 

Leer las respuestas

#1 Alejandro Mesa
26/11/2006 - 16:30 | Informe spam
Christhian,

Al parecer quien creo ese modelo olvido que este se implementaria usando un
sistema de base de datos relacionales. En los sistemas relacionales, se trata
de evitar la duplicacion (redundancia) de data, es por eso que se aplican una
serie de reglas para normalizar el modelo y la tabla [secciones] no cumple
con la primera forma normal, la cual indica que los valores de una columna
deben ser atomico, simples, no arreglos, no listas, etc.

Peligros en el diseño de bases de datos relacionales
http://www.itlp.edu.mx/publica/tuto...ema4_1.htm

Pudieras usar el operador LIKE para hacer la union, pero por la forma en que
este se debe utilizar en esta expresion, no esperes rendimiento alguno.

Select
art.descripcion,
sec.descripcion
from
dbo.articulos as art
inner join
dbo.secciones as sec
on '|' + sec.familias + '|' like '%|' + art.familia + '|%'
go

Si estas usando SQL Server 2005, pudieras crear una funcion que convierta
esa lista en una tabla donde cada fila equivale a un elemento de la lista y
usar el nuevo operador APPLY (CROSS o OUTER) para hacer la union.

Select
art.descripcion,
sf.descripcion
from
dbo.articulos as art
inner join
(
select
f.valor_simple_familia,
s.descripcion
from
dbo.secciones as s
cross apply
dbo.ufn_split(s.familias) as f
) as sf
on art.familia = sf.valor_simple_familia
go


AMB

"Crhisthian" wrote:

Hola, como estas, tengo una duda con SQL ojala y me ayudaran.
como puedo hacer esta operacion:
Tengo dos tablas:
Articulos(ID,EAN,DESCRIPCION,FAMILIA)
Secciones(ID,DESCRIPCION,FAMILIAS(CHAR))
Cada articulo tiene una familia, y las secciones pueden tener varias
familias, ejemplo

Seccion:
1,COMESTIBLES,'1|5|12|19'
si hago un :
Select art.descripcion,sec.descripcion from articulos as art
inner join secciones as sec on art.familia in (replace(sec.familias,'|',','))

me da un error ya que el resultado de replace(sec.familias,'|',',') es un
char y devlueve '1,5,12,19' cuando deberia ser '1','5','12','19' . la verdad
es que yo ya he resueltoeste problema con un charindex, pero la consulta
demora demasiado, aunque al final si funciona, alguno de ustedes sabe si hay
otra manera de hacerlo.
Gracias...

Preguntas similares