Snowflake批量查询视图源表报too many qualifiers错误如何解决
错误原因
报错是因为Snowflake的GET_OBJECT_REFERENCES表函数不支持直接接收CTE返回的行级字段作为参数做隐式行遍历,SQL解析器会错误地将all_views.TABLE_CATALOG这类字段识别为对象标识符的一部分,拼接后超出了Snowflake支持的标识符层级上限,因此触发报错。
解决方案1:使用LATERAL JOIN关联表函数
通过LATERAL JOIN可以实现对上游结果集的每一行调用表函数,是该场景的标准解法,正确SQL如下:
WITH all_views AS ( SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME FROM information_schema.views WHERE table_schema != 'INFORMATION_SCHEMA' ) SELECT v.TABLE_CATALOG AS view_database, v.TABLE_SCHEMA AS view_schema, v.TABLE_NAME AS view_name, r.* FROM all_views v LEFT JOIN LATERAL TABLE(GET_OBJECT_REFERENCES( database_name => v.TABLE_CATALOG, schema_name => v.TABLE_SCHEMA, object_name => v.TABLE_NAME )) r ON TRUE;
提示:使用LEFT JOIN LATERAL可以保留没有任何依赖的常量视图,如果不需要这类视图可以改为内联的逗号分隔写法FROM all_views v, LATERAL TABLE(...) r。
解决方案2:直接查询系统依赖视图(更高效)
Snowflake内置了INFORMATION_SCHEMA.OBJECT_DEPENDENCIES系统视图,已经预存了所有对象的依赖关系,无需逐行调用函数,性能更高:
SELECT REFERENCING_DATABASE AS view_database, REFERENCING_SCHEMA AS view_schema, REFERENCING_OBJECT_NAME AS view_name, REFERENCED_DATABASE AS source_table_database, REFERENCED_SCHEMA AS source_table_schema, REFERENCED_OBJECT_NAME AS source_table_name FROM INFORMATION_SCHEMA.OBJECT_DEPENDENCIES WHERE REFERENCING_OBJECT_TYPE = 'VIEW' AND REFERENCED_OBJECT_TYPE = 'TABLE' AND REFERENCING_SCHEMA != 'INFORMATION_SCHEMA';
提示:如果需要查询跨库的全账户视图依赖,可以使用SNOWFLAKE.ACCOUNT_USAGE.OBJECT_DEPENDENCIES,该视图覆盖全账户元数据,仅需对应角色有ACCOUNT_USAGE访问权限,数据有最长2小时的延迟。
内容的提问来源于stack exchange,提问作者Kishor Kumar
相关产品推荐
相关产品推荐

