Snowflake中如何获取每个初始OLD_ID对应的最终NEW_ID?
获取初始OLD_ID对应的最终NEW_ID解决方案
针对你的需求,以下是Snowflake中的正确实现方式:
方法一:使用START WITH + CONNECT_BY_ISLEAF
SELECT CONNECT_BY_ROOT old_id AS initial_old_id, new_id AS final_new_id FROM temp_table -- 指定递归起点:从未作为NEW_ID出现的OLD_ID(即链条的起始节点) START WITH old_id NOT IN (SELECT new_id FROM temp_table) -- 定义递归关系:上一条的NEW_ID是当前的OLD_ID,沿变更链追溯 CONNECT BY PRIOR new_id = old_id -- 仅保留最终节点(无后续变更的节点) WHERE CONNECT_BY_ISLEAF = 1 ORDER BY initial_old_id;
方法二:先筛选起点再关联查询
WITH initial_ids AS ( -- 筛选所有初始OLD_ID SELECT old_id FROM temp_table WHERE old_id NOT IN (SELECT new_id FROM temp_table) ) SELECT ii.old_id AS initial_old_id, CONNECT_BY_ROOT new_id AS final_new_id FROM temp_table JOIN initial_ids ii ON temp_table.old_id = ii.old_id CONNECT BY PRIOR new_id = old_id WHERE CONNECT_BY_ISLEAF = 1 ORDER BY ii.old_id;
关键说明
- START WITH:精准定位变更链的起始节点(A和W),这些节点从未被其他记录的NEW_ID指向,是链条的源头。
- CONNECT BY PRIOR new_id = old_id:构建正确的递归关联,确保查询沿着
A→B→C→D、W→X→Y→Z的链条追溯。 - CONNECT_BY_ISLEAF = 1:只保留链条的最终节点(D和Z),这些节点没有后续的变更记录,就是你需要的最终NEW_ID。
执行以上任意查询后,都会得到期望的结果:
INITIAL_OLD_ID FINAL_NEW_ID A D W Z
内容的提问来源于stack exchange,提问作者kiranraopatil
相关产品推荐
相关产品推荐

