none
insertar si no existe si no actualizar datos RRS feed

  • Pregunta

  • Tabla Asistencia Estudiantes

    Num_Estudiante      Termino     Fecha_Asistencia

            10                   1515         02/02/2020

            10                   1515         02/05/2020

            11                   1515         02/02/2020

            10                   1616         03/10/2020

            10                   1616         05/05/2020

            11                   1616        05/10/2020                      

    Tabla ULTIMO DIA ESTUDIANTES

    Num_Estudiante     Termino       Fecha_Asistencia

           10                  1616            05/05/2020

           11                  1616            05/10/2020

    Necesito una consulta donde yo pueda añadir los registros si no existen y si ya existen actualizar la Fecha asistencia

    ademas necesito que sea cuando este trabajando con un termino academico en particular osea Where termino=@Termino

    algo como is not exists select * from asistencia estudiantes insert into ultimo dia estudiantes num_Estudiante,Termino, Max(Fecha_Asistencia) else update ultimo dia estudiantes set ........ osea que inserte si no existe y si existe que actualize el max(Fecha_Asistencia)  espero haberme explicado bien

    Gracias

    martes, 14 de julio de 2020 23:23

Todas las respuestas

  • Hola Efrain Diaz:

    Eso corresponde con la sentencia Merge.

    Escenario:

    Create table AsistenciaEstudiantes (Num_Estudiante int, Termino int, Fecha_asistencia Date)
    go
    set dateformat dmy;
    insert into AsistenciaEstudiantes (Num_Estudiante, Termino, Fecha_asistencia)
    values
    (10,1515,'02/02/2020'),
    (10,1515,'02/05/2020'),
    (11,1515,'02/02/2020'),
    (10,1616,'03/10/2020'),
    (10,1616,'05/05/2020'),
    (11,1616,'05/10/2020');          
    go
    Create table UltimoDiaEstudiantes (Num_estudiante int, Termino int, Fecha_Asistencia date)
    go
    insert into UltimoDiaEstudiantes (Num_estudiante, Termino, Fecha_Asistencia)
    values
    (10,1616,'05/05/2020'),
    (11,1616,'05/10/2020');
    go

    Sentencia

    Merge UltimoDiaEstudiantes as Target
    using (
    -- aquí el origen de la información a mergear
    	Select 10, 1515, getDate()
    	Union
    	Select 10, 1616, getDate()
    
    	) as source (Num_estudiante, Termino, Fecha_Asistencia)
    	
    on target.Num_estudiante = source.num_estudiante and target.Termino = source.Termino
    When Matched then 
    	Update Set Fecha_Asistencia = source.Fecha_Asistencia
    When not matched by target then
    	Insert (Num_estudiante, Termino, Fecha_asistencia)
    	values (source.Num_Estudiante, source.Termino, source.Fecha_Asistencia);

    En la parte declarada como source, puedes poner cualquier consulta. Yo he puesto los datos sin provenir de ninguna tabla, pero pueden extraerse de cualquier consulta.

    Salida

    Merge

    https://javifer2.wordpress.com/2019/10/04/merge-upsert-insertar-o-actualizar-en-una-sola-sentencia/

    miércoles, 15 de julio de 2020 2:21
  • Javi gracias como siempre pero no estoy seguro que eso es lo que necesito o tal vez no entiendo del todo la consulta los terminos son periodos de tiempo que no se repiten osea si estoy trabajando con el termino 1515 entro la asistencia de ese periodo hasta que se termine el periodo y el numero del termino no se repite luego viene el termino 1616 donde entro dia tras dia todas las asistencias de los estudiantes y lo que quiero es transferir datos de una tabla a otra ya sea insertando si es la primera vez que se hace una entrada de ese estudiante o actualizando si ya existe una entrada en la tabla con la direferencia que lo unico que va actualizar es el ultimo dia que el estudiante estuvo presente ...

    gracias

    miércoles, 15 de julio de 2020 12:32
  • -- aquí el origen de la información a mergear Select 10, 1515, getDate() Union Select 10, 1616, getDate()

    es aqui donde no entiendo la consulta por que estoy trabajando en un form del vb.net

    miércoles, 15 de julio de 2020 12:34
  • Hola Efrain Diaz:

    Precisamente esa es la fuente de información. En el ejemplo te pongo dos términos diferentes, uno que existía y uno que no, para que inserte el que no existe y actualice el que sí.

    Tu en el form de visual basic, le pasarás a la sentencia merge los parámetros @num_estudiante y  @termino y tú origen será Select @num_estudiante, @termino, getDate() y ese término para esa sentencia se insertará o actualizará.

    jueves, 16 de julio de 2020 0:18