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...

Preguntas similare

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...
Respuesta Responder a este mensaje
#2 Crhisthian
27/11/2006 - 07:58 | Informe spam
Ok Alejandro, con el like el tiempo de respuesa se redujo a un 60%, entiendo
lo que dices con lo de la normalizacion, pero el sistema es de un tercero,
que le vamos a hacer... Muchas gracias

"Alejandro Mesa" wrote:

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...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida