es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no funciona esta consulta SQL de fusión de BigQuery cuando se encuentra una coincidencia?

Esta consulta actualiza correctamente todos los registros con un nombre coincidente y una clave de destino nula:

MERGE
    `MY_TAGET_TABLE` AS Target
USING
    (
        select
            distinct name, key
        from
            `MY_SOURCE_TABLE`
    )
AS Source
ON Source.name = Target.name
WHEN MATCHED and (Target.key is null) THEN UPDATE SET
    Target.key = Source.key,
    Target.load_time = CURRENT_TIMESTAMP()

Esta consulta nunca actualiza ningún registro:

MERGE
    `MY_TAGET_TABLE` AS Target
USING
    (
        select
            distinct name, key
        from
            `MY_SOURCE_TABLE`
    )
AS Source
ON Source.name = Target.name
WHEN MATCHED and (Target.key <> Source.key) THEN UPDATE SET
    Target.key = Source.key,
    Target.load_time = CURRENT_TIMESTAMP()

Mi source tiene todos los valores de key no nulos. La primera consulta es solo una prueba de concepto para mostrar que el resto de la consulta funciona y por alguna razón, la parte (Target.key <> Source.key) de la consulta coincidente no actualiza ningún registro, aunque haya registros con el mismo name pero valores de key que no coinciden. Si en su lugar uso Target.key is null, se actualizarán los registros, aunque esto no cubre todos mis casos de uso (cuando la clave de destino está desincronizada con la clave de origen).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La primera consulta actualiza correctamente todos los registros con un nombre coincidente y una clave de destino nula. Utiliza la instrucción MERGE para combinar las tablas MY_SOURCE_TABLE y MY_TARGET_TABLE en una sola tabla. La cláusula USING define la tabla fuente y la cláusula ON especifica la condición de unión. La cláusula WHEN MATCHED identifica los registros que deben actualizarse cuando se encuentra una coincidencia entre las tablas fuente y destino. En este caso, verifica si el valor de Target.key es nulo y lo actualiza con el valor correspondiente de la tabla fuente utilizando la cláusula UPDATE SET.

    Por otro lado, la segunda consulta nunca actualiza ningún registro. También utiliza la instrucción MERGE con las mismas tablas fuente y destino. Sin embargo, en este caso, la cláusula WHEN MATCHED verifica si el valor de Target.key no es igual al valor correspondiente de la tabla fuente utilizando el operador <>. Esta condición solo será verdadera cuando el valor de Target.key no sea nulo y no coincida con el valor de la tabla fuente. Por lo tanto, si la tabla fuente tiene todos los valores de key no nulos, esta condición nunca se cumplirá y no se actualizarán registros.

    Para asegurarse de que todos los registros con valores coincidentes de name y no coincidentes de key se actualicen, puede modificar la cláusula WHEN MATCHED para usar el operador lógico OR con dos condiciones: una que verifique si Target.key es nulo y otra que verifique si no coincide con el valor correspondiente de la tabla fuente. Esto cubrirá los casos en los que la key de destino está desincronizada con la key de origen y donde es nula. La consulta actualizada se vería así:

    MERGE
        `MY_TARGET_TABLE` AS Target
    USING
        (
            select
                distinct name, key
            from
                `MY_SOURCE_TABLE`
        )
    AS Source
    ON Source.name = Target.name
    WHEN MATCHED and (Target.key is null OR Target.key <> Source.key) THEN UPDATE SET
        Target.key = Source.key,
        Target.load_time = CURRENT_TIMESTAMP()
    

Comments are closed.