即使满足条件并且即使目标表和源表中的字段已经存在,雪花合并也会添加数据
Posted
技术标签:
【中文标题】即使满足条件并且即使目标表和源表中的字段已经存在,雪花合并也会添加数据【英文标题】:Snowflake merge into is adding data even when condition is met and even if fields from target and source tables are already exists 【发布时间】:2021-01-14 10:41:51 【问题描述】:我有以下 Snowflake 语句,它将检查来自暂存文件的散列字段是否已存在于目标表中,然后在不匹配时执行插入:
MERGE INTO LINK_DIMENSION_FIELD AS D
USING (SELECT md5(concat(T.$2, T.$4)) DIM_FIELD, T.$2 DIMENSION_NAME, T.$4 FIELD_NAME
FROM @ingest_stage_temp/dimension_field.csv (FILE_FORMAT=>"GENERIC_CSV_FORMAT") T) ST
ON md5(concat(D.DIMENSION_NAME_HASH_KEY, D.FIELD_NAME_HASH_KEY)) = ST.DIM_FIELD
WHEN NOT MATCHED THEN
INSERT (DIMENSION_NAME_FIELD_NAME_HASH_KEY, LOAD_DT, RECORD_SRC, DIMENSION_NAME_HASH_KEY, FIELD_NAME_HASH_KEY)
VALUES(MD5(CONCAT(ST.DIMENSION_NAME, ST.FIELD_NAME)), current_timestamp(), 'TEST', md5(ST.DIMENSION_NAME), md5(ST.FIELD_NAME));
问题是即使md5(concat(D.DIMENSION_NAME_HASH_KEY, D.FIELD_NAME_HASH_KEY)) = ST.DIM_FIELD
合并总是有效。
如果你能看到,这是运行选择查询后的暂存文件:
SELECT md5(concat(T.$2, T.$4)) DIM_FIELD, T.$2 DIMENSION_NAME, T.$4 FIELD_NAME
FROM @ingest_stage_temp/dimension_field.csv (FILE_FORMAT=>"GENERIC_CSV_FORMAT") T
结果是:
DIM_FIELD DIMENSION_NAME FIELD_NAME
87d7dae13cf0326fd03a348ca6c518b5 cg_child_6mo_receiv_ind_iycf cg_child_6mo_receiv_ind_iycf/nbr_1st_cons_6mc_iycfc
2b75306f968f11b45f066efb9871babb cg_child_6mo_receiv_ind_iycf cg_child_6mo_receiv_ind_iycf/nbr_followup_2nd_time_6mc_iycfc
53273e7133d7a0b513af8c9bcc934437 preg_women_rec_ind_counselling preg_women_rec_ind_counselling/nbr_1st_cons_pregw_iycfc
当我对现有数据运行选择查询时:
select * from LINK_DIMENSION_FIELD;
您可以清楚地看到DIM_FIELD
中的所有值都已在此表中,因此不应进行插入查询:
【问题讨论】:
【参考方案1】:在您的 ON 条款中,您正在比较:
md5(concat(D.DIMENSION_NAME_HASH_KEY, D.FIELD_NAME_HASH_KEY)) = ST.DIM_FIELD
我认为将 ST.DIM_FIELD 与 DIMENSION_NAME_FIELD_NAME_HASH_KEY(目标表中最终计算的列)进行比较可以解决问题。
【讨论】:
是的,我错过了一个额外的md5()
,所以它应该是md5(concat(md5(D.DIMENSION_NAME_HASH_KEY), md5(D.FIELD_NAME_HASH_KEY)))
以上是关于即使满足条件并且即使目标表和源表中的字段已经存在,雪花合并也会添加数据的主要内容,如果未能解决你的问题,请参考以下文章