none
Duda en consulta RRS feed

  • Pregunta

  • Hola

    Tengo la siguiente tabla

    Cursos

    IdCurso int

    IdZonaEscolar int

    IdGrupo

    IdHorario

     

    IdCurso     idZonaEscolar    IdGrupo    Horario

    1                         1                    1                     10:00

    2                    -1                       1                         10:00

    3                       2                        6                   7:00

    Si tengo la consulta

    @ParametroGrupo = 1

    @ParametroZona = 1

    Select idcurso from Cursoswhere (IdGrupo    = @ParametroGrupo or IdGrupo    = -1)

    and (IdZonaEscolar=@ParametroZona or idZonaEscolar=-1)

    Con el comodin -1 en IdZonaEscolar  la consulta tambien me traeria el 2°registro (curso 2), cosa que podría ser generica si tuviera un curso para todos los grupos.

    Pero si solo quiero devolver una fila y en este  caso la de mayor prioridad , es decir , el registro con mayor numero de coincidencias en los parametros(en mi ejemplo el primer registro) que podría hacer?.

    Saludos.


    Para que algo tenga sentido, no es necesario que tenga sentido



    • Editado TCage89 domingo, 22 de enero de 2017 2:22
    domingo, 22 de enero de 2017 2:18

Respuestas

  • Hola,

    Dudo que el valor -1 en las columnas [idZonaEscolar] y [IdGrupo] sea una buena idea en el objetivo de establecer la "opción TODOS", ¿estás sacrificando la integridad referencial?. Lo correcto es crear una tabla intermedia (N:M) donde se establezca la correspondencia entre valores, piénsalo.

    Pues bien, tal y como has escrito las expresiones no veo muchos caminos para forzar una condición exacta a menos que definas un parámetro adicional al cuál establezcas el tipo de coincidencia: exacta o aproximada:

    DECLARE @Cursos table (IdCurso int, IdZonaEscolar int, IdGrupo int, Horario varchar(100));
    INSERT INTO @Cursos VALUES
    (1, 1, 1, '10:00'),
    (2, -1, 1, '10:00'),
    (3, 2, 6, '7:00');
    
    DECLARE @ParametroGrupo int = 1;
    DECLARE @ParametroZona  int = 1;
    DECLARE @ConcidenciaExacta  bit = 1 /*0: Coincidencia Aproximada, 1: Coincidencia Exacta*/;
    
    SELECT 
        idcurso 
    FROM 
        @Cursos
    WHERE 
        (IdGrupo = @ParametroGrupo OR (IdGrupo = -1 AND @ConcidenciaExacta = 0))
        AND (IdZonaEscolar = @ParametroZona OR (IdZonaEscolar = -1 AND @ConcidenciaExacta = 0));
    GO

    Nota que sólo considerará las filas con valor -1 cuando el parámetro @CoincidenciaExacta contenga 0 (coincidencia aproximada), caso contrario mostrará únicamente las filas que coincidan con el valor de los parámetros '@ParametroGrupo' y '@ParametroZona'.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 22 de enero de 2017 6:10
  • Pudieras usar la subclausula TOP (1) y ordenar por (IdGrupo, idZonaEscolar) pero forzando las filas con valor [-1] en cada columna a que se ordenen posterior al valor buscado.

    SELECT TOP (1)
    ...
    ORDER BY
        CASE WHEN IdGrupo = -1 OR IdZonaEscolar = -1 THEN 2 ELSE 1 END,
        IdGrupo,
        IdZonaEscolar;
     


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 23 de enero de 2017 13:56

Todas las respuestas

  • Hola,

    Dudo que el valor -1 en las columnas [idZonaEscolar] y [IdGrupo] sea una buena idea en el objetivo de establecer la "opción TODOS", ¿estás sacrificando la integridad referencial?. Lo correcto es crear una tabla intermedia (N:M) donde se establezca la correspondencia entre valores, piénsalo.

    Pues bien, tal y como has escrito las expresiones no veo muchos caminos para forzar una condición exacta a menos que definas un parámetro adicional al cuál establezcas el tipo de coincidencia: exacta o aproximada:

    DECLARE @Cursos table (IdCurso int, IdZonaEscolar int, IdGrupo int, Horario varchar(100));
    INSERT INTO @Cursos VALUES
    (1, 1, 1, '10:00'),
    (2, -1, 1, '10:00'),
    (3, 2, 6, '7:00');
    
    DECLARE @ParametroGrupo int = 1;
    DECLARE @ParametroZona  int = 1;
    DECLARE @ConcidenciaExacta  bit = 1 /*0: Coincidencia Aproximada, 1: Coincidencia Exacta*/;
    
    SELECT 
        idcurso 
    FROM 
        @Cursos
    WHERE 
        (IdGrupo = @ParametroGrupo OR (IdGrupo = -1 AND @ConcidenciaExacta = 0))
        AND (IdZonaEscolar = @ParametroZona OR (IdZonaEscolar = -1 AND @ConcidenciaExacta = 0));
    GO

    Nota que sólo considerará las filas con valor -1 cuando el parámetro @CoincidenciaExacta contenga 0 (coincidencia aproximada), caso contrario mostrará únicamente las filas que coincidan con el valor de los parámetros '@ParametroGrupo' y '@ParametroZona'.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 22 de enero de 2017 6:10
  • Pudieras usar la subclausula TOP (1) y ordenar por (IdGrupo, idZonaEscolar) pero forzando las filas con valor [-1] en cada columna a que se ordenen posterior al valor buscado.

    SELECT TOP (1)
    ...
    ORDER BY
        CASE WHEN IdGrupo = -1 OR IdZonaEscolar = -1 THEN 2 ELSE 1 END,
        IdGrupo,
        IdZonaEscolar;
     


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 23 de enero de 2017 13:56