none
Evitar insertar campos duplicados. RRS feed

  • Pregunta

  • Buenas, tengo la siguiente query, con la cual ingreso a los usuarios que no esten registrados el problema es cuando ejecuto la query por segunda vez inserta el mismo quisiera saber como puedo evitar eso .

    Prove con el IF NOT EXISTS pero no me funciono.

    set @Id_Usuario = 100
    set @Fecha_Inicio = '2017-02-20'
    set @Fecha_Final = '2017-02-24'

    Insert into AUSENCIAS (Id_Usuario,Fecha,Hora,Autorizado,AusenciaTipo,AusenciaJustificacion)
    select JK.* 
    from (SELECT @Id_Usuario AS Id_Usuario,A.Fecha_S AS 'Fecha',
    NULL AS 'Hora',
    NULL As 'Autorizado',
    'FALTA' AS 'AusenciaTipo',
    NULL As 'AusenciaJustificacion' 
    FROM (SELECT * 
    FROM FECHA_COMPROBAR 
    WHERE FECHA_COMPROBAR.Fecha_S BETWEEN /@Fecha_Inicio AND @Fecha_Final
    ) AS A
    LEFT JOIN (SELECT * 
    FROM INFO 
    WHERE INFO.Id_Usuario=@Id_Usuario) AS E ON A.Fecha_S = E.Fecha--Id_Usuario
    where e.Id_Usuario is null ) AS JK


    viernes, 17 de marzo de 2017 0:05

Respuestas

  • De acuerdo, pero entonces ¿cuál es el problema?

    ¿Deseas validar que no se inserte un mismo registro en la tabla [AUSENCIAS]? de ser así ¿cuáles son las columnas por las que haces la validación?

    Tomaré las columnas Id_Usuario, Fecha y Hora:

    INSERT INTO AUSENCIAS 
        (Id_Usuario, Fecha, Hora, Autorizado, AusenciaTipo, AusenciaJustificacion)
    SELECT 
        JK.* 
    FROM 
        (
    	   SELECT 
    		  @Id_Usuario AS Id_Usuario, 
    		  A.Fecha_S AS 'Fecha',
    		  NULL AS 'Hora',
    		  NULL As 'Autorizado',
    		  'FALTA' AS 'AusenciaTipo',
    		  NULL As 'AusenciaJustificacion' 
    	   FROM 
    		  (
    			 SELECT * 
    			 FROM 
    				FECHA_COMPROBAR 
    			 WHERE 
    				FECHA_COMPROBAR.Fecha_S BETWEEN @Fecha_Inicio AND @Fecha_Final
    		  ) AS A
    		  LEFT JOIN (
    			 SELECT * 
    			 FROM 
    				INFO 
    			 WHERE 
    				INFO.Id_Usuario = @Id_Usuario
    		  ) AS E ON A.Fecha_S = E.Fecha
    	   WHERE 
    		  E.Id_Usuario IS NULL
        ) AS JK
    WHERE
        NOT EXISTS (SELECT 1 FROM AUSENCIAS 
    	   WHERE Id_Usuario = JK.Id_Usuario, Fecha = JK.Fecha, Hora = JK.Hora)
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Eduardo_Ramirez viernes, 17 de marzo de 2017 18:09
    viernes, 17 de marzo de 2017 1:00

Todas las respuestas

  • Eduardo_Ramirez,

    Pues no entiendo lo que intentas hacer con las tablas derivadas. ¿La sub-consulta a la derecha del LEFT JOIN es para validar la existencia del valor? ¿La existencia del valor no se efectúa para la tabla [AUSENCIAS]?. Intenta con la siguiente consulta:

    SET @Id_Usuario = 100;
    SET @Fecha_Inicio = '20170220';
    SET @Fecha_Final = '20170224';
    
    INSERT INTO AUSENCIAS 
        (Id_Usuario, Fecha, Hora, Autorizado, AusenciaTipo, AusenciaJustificacion)
    SELECT 
        @Id_Usuario AS Id_Usuario, 
        fc.Fecha_S AS 'Fecha',
        NULL AS 'Hora',
        NULL As 'Autorizado',
        'FALTA' AS 'AusenciaTipo',
        NULL As 'AusenciaJustificacion' 
    FROM 
        FECHA_COMPROBAR fc
    WHERE 
        fc.Fecha_S BETWEEN @Fecha_Inicio AND @Fecha_Final
        AND NOT EXISTS (SELECT 1 FROM INFO i 
    	   WHERE i.Id_Usuario = @Id_Usuario AND fc.Fecha_S = i.Fecha)
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 17 de marzo de 2017 0:40
  • Perdón por no explicarme bien, lo que uso es comparar mi tabla INFO con mi tabla FECHA_COMPARAR  para sacar las faltas mediante el Id_Usuario y  Fecha. ya que si falta no sale en el registro por eso uso left join.

    la tabla fecha comprobar solo tiene una columna (fecha_S) la cual tiene puras fechas.


    viernes, 17 de marzo de 2017 0:53
  • De acuerdo, pero entonces ¿cuál es el problema?

    ¿Deseas validar que no se inserte un mismo registro en la tabla [AUSENCIAS]? de ser así ¿cuáles son las columnas por las que haces la validación?

    Tomaré las columnas Id_Usuario, Fecha y Hora:

    INSERT INTO AUSENCIAS 
        (Id_Usuario, Fecha, Hora, Autorizado, AusenciaTipo, AusenciaJustificacion)
    SELECT 
        JK.* 
    FROM 
        (
    	   SELECT 
    		  @Id_Usuario AS Id_Usuario, 
    		  A.Fecha_S AS 'Fecha',
    		  NULL AS 'Hora',
    		  NULL As 'Autorizado',
    		  'FALTA' AS 'AusenciaTipo',
    		  NULL As 'AusenciaJustificacion' 
    	   FROM 
    		  (
    			 SELECT * 
    			 FROM 
    				FECHA_COMPROBAR 
    			 WHERE 
    				FECHA_COMPROBAR.Fecha_S BETWEEN @Fecha_Inicio AND @Fecha_Final
    		  ) AS A
    		  LEFT JOIN (
    			 SELECT * 
    			 FROM 
    				INFO 
    			 WHERE 
    				INFO.Id_Usuario = @Id_Usuario
    		  ) AS E ON A.Fecha_S = E.Fecha
    	   WHERE 
    		  E.Id_Usuario IS NULL
        ) AS JK
    WHERE
        NOT EXISTS (SELECT 1 FROM AUSENCIAS 
    	   WHERE Id_Usuario = JK.Id_Usuario, Fecha = JK.Fecha, Hora = JK.Hora)
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Eduardo_Ramirez viernes, 17 de marzo de 2017 18:09
    viernes, 17 de marzo de 2017 1:00
  • PERDÓN POR LA DEMORA, LAS COLUMNAS SON ID_USUARIO, Y FECHA DE LA TABLA INFO , EFECTIVAMENTE UNA VEZ QUE ENCUENTRO LA FALTA LA GUARDO EN LA TABLA AUSENCIAS  QUE INGRESO LA FALTA NO QUIERO QUE SE VUELVA A REGISTRAR ESA MISMA.

    viernes, 17 de marzo de 2017 17:46