Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Una SELECT para nota.

Estas en el tema de Una SELECT para nota. en el foro de SQL Server en Foros del Web. A ver si me puede ayudar algun@. Presento mi escenario Es una base de datos de conocimiento. 3 tablas relacionadas. La primera guarda el conocimiento ...
  #1 (permalink)  
Antiguo 25/06/2008, 02:22
 
Fecha de Ingreso: junio-2008
Mensajes: 2
Antigüedad: 15 años, 10 meses
Puntos: 0
Una SELECT para nota.

A ver si me puede ayudar algun@. Presento mi escenario

Es una base de datos de conocimiento. 3 tablas relacionadas.

La primera guarda el conocimiento en sí.

KnowHow
ID
Título
Texto
(hay más pero pongo solo estos, para abreviar)

Claro que no todo el mundo tiene que ser capaz de verlo, por lo que tengo otra tabla
KnowHowShare
ID
KnowHowID (FK contra KnowHow.ID)
WorkGroupID(FK contra WorkGroups)

Así, un KnowHow puede estar compartido con varios grupos, OK?
Lógicamente hay una tabla WorkGroups de la que extraigo el nombre del grupo ETC. No la pongo para abreviar...de todas maneras no la necesitamos ahora.

Pero es que...un usuario puede pertenecer a mas de un grupo. Por lo que tengo la siguiente tabla

UserWorkGroups
ID
username
WorkGroupID

Luego, un usuario pertenece a uno o varios grupos (por lo menos uno, eso si) y un knowHow esta compartido con uno o mas grupos.

Se trata de extraer aquellos registros que pueda ver un usuario en concreto, no seleccionando los demas.
Para ello tengo el siguiente SP

ALTER PROCEDURE [dbo].[dhlkb_KnowHow_KnowHow_GetKnowHowByCatID] (

@UserName as nvarchar(256))

AS

SET NOCOUNT ON

SELECT KnowHow.KnowHowID, KnowHow,Titulo, KnowHow.Texto
FROM DHLKB_KnowHow INNER JOIN
KnowHow_Shares ON KnowHow.KnowHowID = KnowHow_Shares.KnowHowID
WHERE (KnowHow_Shares.WorkGroupID IN
(SELECT WorkGroupID
FROM UserWorkgroups
WHERE (LOWER(UserName) = LOWER(@UserName))))

El problema de esto, es que si un know how esta compartido con varios grupos, se repiten tantos registros como coincidencias haya con los grupos de ese usuario.

Es decir...si el knowHow ID 1, esta compartido con el grupo 10,11,12,13 y el usuario esta en el grupo 10,11 y 13, ese registro saldra repetido 3 veces.

Se le ocurre a alguien alguna manera de hacer esto sin usar un distinct? No se, pero me da que el rendimiento caera bastante cuando empiece a crecer la BDD, y compare textos monstruosos que se de antemano son iguales.

Espero me haya expresado bien.
  #2 (permalink)  
Antiguo 25/06/2008, 10:08
 
Fecha de Ingreso: junio-2008
Mensajes: 2
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Una SELECT para nota.

Vale, me pongo un 10 a mi mismo.
Usando una join normal y sin subselect
SELECT DISTINCT KH.KnowHowID,
KH.AddedBy,
KH.AddedDate,
KH.AddedByIP,
KH.ModifiedBy,
KH.ModifiedDate,
KH.ModifiedByIP,
KH.Title,
KH.Text,
KH.CategoryID,
Cat.Title AS CategoryTitle

FROM DHLKB_KnowHow KH,
DHLKB_Categories Cat,
DHLKB_KnowHow_Shares KHS,
DHLKB_UserWorkGroups UWG
WHERE KH.CategoryID = Cat.CategoryID AND
KH.KnowHowID = KHS.KnowHowID AND
LOWER(UWG.UserName) = LOWER(@UserName) AND
KHS.WorkGroupID = UWG.WorkGroupID AND
Cat.CategoryID = @CategoryID
Esto sin Distinct me devuelve filas como
KnowHowID Titulo Bla bla Compartido con...

1 Titulo1 21
1 Titulo1 22
2 Titulo2 22
3 Titulo3 21
3 Titulo3 23


El usuario esta en los grupos 21,22 y 23
El conocimiento 1 está compartido con los grupos 21,22 y 25, pero como coinciden 2, pues pongo 2 registros...aunque sean iguales
El conociemiento 2 esta compartido con los grupos 22 y 47...como coincide con el 22, pues pongo 1 registro
El conocimiento 3 está compartido con los grupos 12 y 23....como coinciden 2 grupos, los pongo

No se que os parece...teniendo en cuenta que el texto es un campo NVARCHAR(MAX) y puede tener que hacer comparaciones muy largas consigo mismo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:29.