Hola lista.
Les pido ayuda con algo que de seguro es una simpleza, pero no doy con la 
solucion.
Necesito filtrar una tabla con un JOIN con un parametro que puede estar o no 
presente.
Me explico mas claramente.
Tengo una tabla Archivo y una tabla Categoria. Un archivo puede tener mas de 
una (o ninguna), osea que tambien esta la tabla ArchivoCategoria.
Necesito listar Archivos. El stored tiene varios parametros para filtrado con 
null por defecto. Uno de ellos filtra los resultados basado en un campo de la 
segunda tabla del JOIN. Esta es la que me trae problemas.
Si llega null, se deben listar todos los archivos, sino, solo los de esa 
categoría. La consulta esta paginada.
Actualmente tengo algo como

@Pagina int = 1,
@RegistrosPagina int = 10,
@OrdenCampo varchar(50) = '',
@OrdenTipo bit = 0,
@CantidadPaginas int = null output,
@archivo_ArchivoTipo_Id int = null,
@archivo_Nombre varchar (200) = null,
@archivo_Extension varchar (5) = null,
@archivo_Categoria int  = null    -- ESTE FILTRO ME TRAE PROBLEMAS
AS
BEGIN 
SELECT DISTINCT 
archivo_Id,
archivo_ArchivoTipo_Id, 
archivo_Nombre, 
archivo_Descripcion, 
archivo_Extension, 
archivo_NombreArchivo,

ROW_NUMBER() OVER(ORDER BY
CASE WHEN UPPER(@OrdenCampo) = 'ARCHIVO_ARCHIVOTIPO_ID' AND @OrdenTipo = 0 THEN 
ARCHIVO_ARCHIVOTIPO_ID ELSE null END ASC, 
CASE WHEN UPPER(@OrdenCampo) = 'ARCHIVO_ARCHIVOTIPO_ID' AND @OrdenTipo = 1 THEN 
ARCHIVO_ARCHIVOTIPO_ID ELSE null END DESC, 
CASE WHEN UPPER(@OrdenCampo) = 'ARCHIVO_NOMBRE' AND @OrdenTipo = 0 THEN 
ARCHIVO_NOMBRE ELSE null END ASC, 
CASE WHEN UPPER(@OrdenCampo) = 'ARCHIVO_NOMBRE' AND @OrdenTipo = 1 THEN 
ARCHIVO_NOMBRE ELSE null END DESC, 
CASE WHEN UPPER(@OrdenCampo) = 'ARCHIVO_EXTENSION' AND @OrdenTipo = 0 THEN 
ARCHIVO_EXTENSION ELSE null END ASC, 
CASE WHEN UPPER(@OrdenCampo) = 'ARCHIVO_EXTENSION' AND @OrdenTipo = 1 THEN 
ARCHIVO_EXTENSION ELSE null END DESC) AS numRow

INTO #TablaTmp

FROM Archivo

LEFT JOIN ArchivoArchivoCategoria

ON Archivo_Id = ArchivoArchivoCategoria_Archivo_id

WHERE archivo_ArchivoTipo_Id = COALESCE(@archivo_ArchivoTipo_Id, 
archivo_ArchivoTipo_Id)
AND archivo_Nombre LIKE COALESCE('%' + @archivo_Nombre + '%', '%')
AND archivo_Extension LIKE COALESCE(@archivo_Extension, '%') 
AND (@archivo_Categoria is null  OR archivoArchivoCategoria_ArchivoCategoria_Id 
= @archivo_Categoria)
AND Archivo_Valido = 1

Despues hago un select sobre esa #TablaTmp para obtener la pagina en cuestion.

Si se especifica una categoria funciona, pero sino, me trae los archivos que 
tienen mas de una categoria repetidos. Por ejemplo, si evaluacionindices.xls 
esta asociado a las categorias "Planillas", "Procesos estadisticos", y 
"Archivos internos", me aparece tres veces.
Ignora completamente el DISTINCT.
He probado la misma stored sin paginar y toma el distinct correcto.
Con otros intentos (poner la condición de relacion de categoria dentro del 
bloque ON del JOIN, u otras formas) me trae solamente los archivos que tienen 
alguna categoria y los otros no, y en otro de los intentos me trae bien un solo 
archivo por cada uno, pero ignora si se especifica una categoria (trae todos 
igual).

El filtrado por los otros criterios funciona bien (nombre, extension, etc)

Si tengo estas relaciones:

Archivo
1 A
2 B
3 C
4 D

Categoria
1 V
2 W
3 X

ArchivoCategoria
1 2
1 3
2 3
4 1

Si en el parametro @Categoria no se especifica nada (queda en null) deberia 
obtener:

1 A
2 B
3 C
4 D

Si en cambio se especifica la categoria 3 deberia obtener
1 A
2 B

Esto ultimo funciona bien, pero si llega el parametro null obtengo:
1 A
1 A
2 B
3 C
4 D

Me repite el "1 A" porque tiene dos categorias. Ignora completamente el 
DISTINCT.

Debo estar muy agotado a estas horas, pero no le veo claridad al caso.
Se agradecera un salvataje compañeros.

Matias Tranak

Responder a