¿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).
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
yMY_TARGET_TABLE
en una sola tabla. La cláusulaUSING
define la tabla fuente y la cláusulaON
especifica la condición de unión. La cláusulaWHEN 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 deTarget.key
es nulo y lo actualiza con el valor correspondiente de la tabla fuente utilizando la cláusulaUPDATE 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 deTarget.key
no es igual al valor correspondiente de la tabla fuente utilizando el operador<>
. Esta condición solo será verdadera cuando el valor deTarget.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 dekey
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 dekey
se actualicen, puede modificar la cláusulaWHEN MATCHED
para usar el operador lógicoOR
con dos condiciones: una que verifique siTarget.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 lakey
de destino está desincronizada con lakey
de origen y donde es nula. La consulta actualizada se vería así: