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