Dudas en la Consulta de Datos Anexados

Necesito saber si pueden ayudarme en esto. Tengo una tabla llamada T1, y otra llamada T2. Tengo una consulta de Datos Anexados que inserta datos en T2 a partir de la tabla T1.

Ambas tablas tienen un campo Mes. Necesito lo siguiente:

Cuando el Mes de T1 sea igual a alguno de los campos Mes de T2, no inserte los datos sino que los sobrescriba (UPDATE) y si el valor de T1.[Mes] es > T2.[Mes] entonces si Inserte

El código de la consulta de datos anexados es:

INSERT INTO [T2]
SELECT [T1].*
FROM [T1];

A este código le falta el análisis que expliqué al principio.

2 Respuestas

Respuesta
1

Para lograr exactamente lo que necesitas (actualizar si el mes es igual e insertar si el mes es mayor), la solución estándar y más eficiente es dividir la lógica en dos consultas independientes que se ejecutan en orden: primero la de actualización (UPDATE) y luego la de inserción (INSERT).

Paso 1: Crear la consulta de Actualización (UPDATE)

Esta consulta buscará los registros donde el campo Mes de T1 sea igual al de T2 y sobrescribirá los datos con la información de T1.

UPDATE T2 
INNER JOIN T1 ON T2.Mes = T1.Mes 
SET T2.Campo1 = T1.Campo1, T2.Campo2 = T1.Campo2;

(Nota: Debes reemplazar Campo1, Campo2, etc., por los nombres reales de los campos que deseas actualizar en tus tablas).

Paso 2: Crear la consulta de Inserción (INSERT)

Esta consulta insertará los registros nuevos desde T1 hacia T2 únicamente cuando el valor de Mes en T1 sea mayor al valor máximo existente en T2 (o no exista previamente).

INSERT INTO T2 (Mes, Campo1, Campo2)
SELECT T1.Mes, T1.Campo1, T1.Campo2
FROM T1
WHERE T1.Mes > (SELECT Nz(MAX(Mes), 0) FROM T2)
  AND T1. Mes NOT IN (SELECT Mes FROM T2);

Asumo que has guardado las consultas con los nombres qryActualizar y qryInsertar. Presione Alt + F11 para abrir el editor de visual basic. Has clic en Insertar Módulo y copia el código siguiente:

Public Function EjecutarActualizacionEInsercion()
    On Error GoTo ManejadorDeErrores
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "qryActualizar"
    DoCmd.OpenQuery "qryInsertar"
    DoCmd.SetWarnings True
    MsgBox "Proceso completado con éxito.", vbInformation
    Exit Function
ManejadorDeErrores:
    DoCmd.SetWarnings True
    MsgBox "Error: " & Err.Description, vbCritical
End Function

Asocie en un formulario a un botón en el evento Al hacer clic

EjecutarActualizacionEInsercion

Como complemento te muestro cómo sería aún más fácil en PostgreSQL (mi preferido).

En PostgreSQL, hacer esto es muchísimo más fácil y elegante que en Access, ya que PostgreSQL soporta de forma nativa la cláusula ON CONFLICT (conocida comúnmente como UPSERT).

No necesitas dividirlo en dos consultas ni usar código VBA. Todo se resuelve en una sola sentencia SQL muy eficiente. La consulta en PostgreSQL

Asumiendo que el campo Mes en la tabla T2 tiene una Restricción de Unicidad (Unique) o es la Clave Primaria (Primary Key), la consulta es la siguiente:

INSERT INTO t2 (mes, campo1, campo2)
SELECT mes, campo1, campo2
FROM t1
ON CONFLICT (mes) 
DO UPDATE SET 
    campo1 = EXCLUDED.campo1,
    campo2 = EXCLUDED.campo2;

Otra forma a partir de la versión 15 de PostgreSQL:

MERGE INTO t2 AS t
USING t1 AS s
ON t.mes = s.mes
WHEN MATCHED THEN
    UPDATE SET 
        campo1 = s.campo1, 
        campo2 = s.campo2
WHEN NOT MATCHED THEN
    INSERT (mes, campo1, campo2) 
    VALUES (s.mes, s.campo1, s.campo2);

Saludos Eduardo. Como siempre su respuesta muy rápida y efectiva. Voy a probarla hoy mismo y le comento. Ya me están entrando deseos de conocer PostgreSQL . Saludos cordiales

Por experiencia no pierdas el tiempo con tablas en Access déjalo como frontend y utiliza PostgreSQL como backend y en lo posible no utilices tablas vinculadas son un problema cuando tengas tu base de datos compartida en un servidor. Personalmente programo en Access pero sin tablas y consultas, solo formularios desvinculados y módulos de clase, así aprovecho al máximo Access y el servidor.

Una de las grandes ventajas de usar PostgreSQL es que puedes compartir en la nube la información, además, puedes realizar consultas complejas, crear funciones, usar disparadores. También puede usar la base de datos para otro frontend como, python, c#, java etc. Y muchas ventajas donde Access se queda corto. Si de veras estas interesado enseño Access y PostgreSQL Me puedes contactar en [email protected] o al WhatsApp 057 3185612588.

Respuesta

I. Hola Dinorah, aunque tendría que responderle un experto en programación de esta página y no puedo ofrecerle orientación por desconocimiento si lo desea, en caso de que no reciba una respuesta a lo largo de la próxima semana podría facilitarle comunicación directa con una persona conocedora.

Por mi parte sólo conozco la función 'MERGE', que no sé si se acercase a lo que necesita.

https://towardsdatascience-com.translate.goog/sql-insert-delete-and-update-in-one-statement-sync-your-tables-with-merge-14814215d32c/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

Creo tuve la suerte de ver una buena aproximación a su consulta en la Comunidad de TodoExcel pero por desgracia es necesario estar registrado como usuario para poder acceder a los datos.

https://foro.todoexcel.com/threads/relacionar-2-tablas-de-datos-por-medio-de-fechas.57891/ 

Como habitual de la comunidad deseaba dejarle una pequeña información relacionada a su consulta con la esperanza de que, si dispusiera de tiempo, pudiese serle de alguna utilidad mientras le atienden. Serían unas páginas de consultas anteriores junto a una respuesta elaborada por la I.A.

Disculpe por todas las molestias de tanta lectura y la manera de responderle. Ánimo.


https://www-baeldung-com.translate.goog/sql/insert-update-if-row-exists?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://stackoverflow.com/questions/74206853/modify-two-tables-insert-or-update-based-on-existance-of-a-row-in-the-first-ta 

https://www.facebook.com/Elingefrancisco/videos/c%C3%B3mo-cruzar-tablas-de-base-de-datos-en-excel-de-la-manera-m%C3%A1s-f%C3%A1cil/643990830685782/ 

https://stackoverflow.com/questions/20404682/sql-insert-into-from-multiple-tables 

https://www.sqlservercentral.com/forums/topic/replace-table-with-staging_table-approach 

https://www.reddit.com/r/SQL/comments/1aih531/is_it_possible_to_overwrite_the_table_data_with/ 

https://www-tigerdata-com.translate.goog/learn/using-postgresql-update-with-join?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc&_x_tr_hist=true 

https://elixirforum-com.translate.goog/t/avoiding-same-data-inserted-multiple-times-at-the-same-time-into-a-table/57655?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 


*Para actualizar registros en lugar de insertar cuando el mes coincida, usa una instrucción INSERT ... ON DUPLICATE KEY UPDATE en MySQL, o una cláusula MERGE en SQL Server y Oracle, asegurándote de que el campo Mes sea una clave única o primaria.

Cómo hacerlo en MySQL (ON DUPLICATE KEY UPDATE)

  • Añade un índice único a la columna Mes en la tabla destino.

  • Usa la sentencia de inserción normal.

  • Agrega la cláusula final para actualizar los campos si el mes ya existe.

    sql

    INSERT INTO tabla_destino (Mes, valor1, valor2)
    SELECT Mes, valor1, valor2 FROM tabla_origen
    ON DUPLICATE KEY UPDATE 
        valor1 = VALUES(valor1),
        valor2 = VALUES(valor2);
    

    - Cómo hacerlo en SQL Server o Oracle (MERGE)

    • Compara ambas tablas usando el campo Mes como nexo.

    • Indica la acción WHEN MATCHED para sobrescribir los datos.

    • Indica la acción WHEN NOT MATCHED para insertar los datos nuevos.

      sql

      MERGE INTO tabla_destino AS target
      USING tabla_origen AS source
      ON target.Mes = source.Mes
      WHEN MATCHED THEN
          UPDATE SET target.valor1 = source.valor1, target.valor2 = source.valor2
      WHEN NOT MATCHED THEN
          INSERT (Mes, valor1, valor2) VALUES (source.Mes, source.valor1, source.valor2

      ¡Muchas gracias David! Usted siempre muy atento

      I. Hola Dinorah, muchísimas gracias por sus palabras y amabilidad :) me alegro de que el experto Edyardo Pérez ya se encuentre antendiéndole, ojalá pueda realizar pronto esta operación. Ánimo.

      Añade tu respuesta

      Haz clic para o

      Más respuestas relacionadas