Snowflake CTE查询出现RECONCILLIATION_WORKDAY_WORKER_TIMESHEET标识符无效报错
问题原因说明
这个报错确实是SQL作用域可见性规则导致的,属于标准SQL的通用规则,并非Snowflake独有。
- 你通过WITH定义的
ASCENDER_EMPLOYEE、WORKDAY_EMPLOYEE属于临时结果集,主查询的FROM/JOIN子句仅引入了这两个CTE的作用域(分别用别名WORKDAY、ASCENDER指代) - 原始基表
RECONCILLIATION_WORKDAY_WORKER_TIMESHEET没有被直接加入到主查询的FROM/JOIN列表中,因此主查询层面无法直接访问该基表的字段 - 你单独查询基表能成功,是因为单独查询时直接在FROM子句里指定了该基表,作用域被正常引入
修复方案
把主查询SELECT子句里的RECONCILLIATION_WORKDAY_WORKER_TIMESHEET.EMPLOYEE_ID替换为WORKDAY.EMPLOYEE_ID即可。WORKDAY是你给WORKDAY_EMPLOYEE这个CTE起的别名,该CTE已经从基表中查询到了EMPLOYEE_ID字段,可以直接引用。
修复后完整代码:
use database DQ_MART; use schema WORKING; WITH ASCENDER_EMPLOYEE AS ( SELECT DISTINCT EMPLOYEE_ID FROM RECONCILLIATION_ASCENDER_WORKER_TIMESHEET ), WORKDAY_EMPLOYEE AS ( SELECT DISTINCT EMPLOYEE_ID FROM RECONCILLIATION_WORKDAY_WORKER_TIMESHEET ) SELECT 'Missing employee in Ascender' DQ_RULE_NAME, WORKDAY.EMPLOYEE_ID KEY FROM WORKDAY_EMPLOYEE WORKDAY LEFT OUTER JOIN ASCENDER_EMPLOYEE ASCENDER ON ASCENDER.EMPLOYEE_ID = WORKDAY.EMPLOYEE_ID ;
额外建议
- 写SQL时如果给表/CTE起了别名,后续所有引用都优先用别名,既简化代码也避免作用域识别错误
- 主查询的所有字段来源必须是FROM/JOIN子句中显式指定的表、视图或CTE,不能直接引用CTE内部用到的基表字段
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

