Snowflake递归数据检索问题:按Job_id过滤临时库关联记录
解决递归检索下游数据时临时表跨Job_id干扰的问题
核心是在CONNECT BY的关联逻辑里区分永久库和临时库的不同关联规则:
关键逻辑
- 永久库的表是全局共享的,父节点输出为永久库时,只需匹配子节点的输入库和表即可,不用限制Job_id
- 临时库的表是Job内隔离的,父节点输出为临时库时,必须强制子节点和父节点的
Job_id相同,再匹配库和表
修正后的SQL示例
假设你的表名为job_lineage,可以用以下SQL实现正确的递归检索:
SELECT t.*, CONNECT_BY_PATH(Job_id, '->') AS job_path -- 可选,用于验证链路的Job_id连续性 FROM job_lineage t START WITH Input_database = 'permanent' AND Input_table = 'source_1' CONNECT BY -- 场景1:父节点输出是永久库,仅匹配库和表 (PRIOR t.Output_database = 'permanent' AND PRIOR t.Output_database = t.Input_database AND PRIOR t.Output_table = t.Input_table) -- 场景2:父节点输出是临时库,必须匹配Job_id+库+表 OR (PRIOR t.Output_database != 'permanent' AND PRIOR t.Job_id = t.Job_id AND PRIOR t.Output_database = t.Input_database AND PRIOR t.Output_table = t.Input_table);
细节调整
如果你的临时库有特定命名规则(比如以temp_开头),可以把临时库的判断条件改成更精准的匹配:
PRIOR t.Output_database LIKE 'temp_%'
替换掉原逻辑中的PRIOR t.Output_database != 'permanent'即可。
验证方法
通过CONNECT_BY_PATH(Job_id, '->')字段可以直观看到每条记录的Job链路,确认是否存在混入的无关Job_id(比如你提到的Job_id=2),确保递归链路的正确性。
内容的提问来源于stack exchange,提问作者learn_more
相关产品推荐
相关产品推荐

