ID Nombre Atributos
1 Carlos -1,0,1,2
2 Pepita -1,2,5,12
3 Ma�a 0,2
4 Carlos --
Los atributos son separados por comas, estos no se repiten , van de -1 hasta
15, una persona puede no tener atributos.
Lo que necesito es una selecci�n que diga algo as�:
Mostrar los nombres de todos los que pos�en el atributo 2 y el atributo 12
Muchas gracias por su valiosa ayuda.
SQL Server 2005.
Antes que nada te recomendar�a que no almacenaras los datos desnormalizados
separados por comas. Para hacer la b�squeda de aquellos que tienen el atributo
2 y 12 podr�as hacer algo como esto:
select nombre from tabla where
','+atributos+',' like '%,2,%' and
','+atributos+',' like '%,12,%'
Como ves, una soluci�n sucia, poco mantenible, no indexable, etc. Mala idea
almacenar los atributos de esta forma... :(
Un saludo,
Rub�n Garrig�s
Solid Quality Mentors
Blog: http://blogs.solidq.com/es/elrincondeldba
USE tempdb;
GO
DECLARE @t1 TABLE (
ID int NOT NULL UNIQUE,
Nombre varchar(50),
Atributos varchar(50)
);
DECLARE @t2 TABLE (Atributo varchar(5) NOT NULL UNIQUE);
INSERT INTO @t1 VALUES(1, 'Carlos', '-1,0,1,2');
INSERT INTO @t1 VALUES(2, 'Pepita', ' -1,2,5,12');
INSERT INTO @t1 VALUES(3, 'Maa', '0,2');
INSERT INTO @t2 VALUES('2');
INSERT INTO @t2 VALUES('12');
SELECT
T1.ID, MIN(T1.Nombre) AS [Nombre], MIN(T1.Atributos) AS [Atributos]
FROM
@t1 AS T1
INNER JOIN
@t2 AS T2
ON ',' + T1.Atributos + ',' LIKE '%,' + T2.Atributo + ',%'
GROUP BY
T1.ID
HAVING
COUNT(DISTINCT T2.Atributo) = (SELECT COUNT(*) FROM @t2);
GO
Aqui tienes una explicacion de la operacion "division relacional" que he
usado para resolver este problema.
Relational Division
http://www.dbazine.com/ofinterest/oi-articles/celko1
Hubiese sido mucho mas practico si en vez de tener una lista de atributos,
tuvieses una tabla o relacion para almacenar los atributos relacionados con
un [ID].
create table dbo.Persona_Atributo (
PersonaID int not null,
AtributoID char(2) not null,
constraint PK_Persona_Atributo primary key (PersonaID, AtributoID),
constraint FK_Persona_Atributo_Persona foreign key (PersonaID) references
dbo.Persona(PersonaID),
constraint FK_Persona_Atributo_Atributo foreign key (AtributoID) references
dbo.Atributo(AtributoID)
);
GO
insert into dbo.Persona_Atributo values(1, '-1');
insert into dbo.Persona_Atributo values(1, '0');
insert into dbo.Persona_Atributo values(1, '1');
insert into dbo.Persona_Atributo values(1, '2');
...
AMB
"DT" wrote:
> Hola a todos.
> Tengo lo siguiente:
>
> ID Nombre Atributos
> 1 Carlos -1,0,1,2
> 2 Pepita -1,2,5,12
> 3 Maa 0,2
> 4 Carlos --
>
> Los atributos son separados por comas, estos no se repiten , van de -1 hasta
> 15, una persona puede no tener atributos.
> Lo que necesito es una seleccin que diga algo as:
> Mostrar los nombres de todos los que posen el atributo 2 y el atributo 12
Muchas gracias.
"Alejandro Mesa" <Alejan...@discussions.microsoft.com> wrote in message
news:44B675D4-0798-4420...@microsoft.com...