SNOWFLAKE:使用变量和标识符()定义查询列的不明确列错误



这是针对数据分析任务的,而不是ETL。我需要在略有不同的上下文中一遍又一遍(至少 200 倍(执行相同的任务,因此我正在构建查询以在列名和表名的变量上运行。这使我可以为每次测试迭代更新一次列/表名称,并轻松运行多个分析查询。

这大多有效。例如:

SET ColName = 'MyColumnName';
SELECT identifier($ColName) FROM db.schema.table1 t1
LEFT JOIN db.schema.table2 t2 ON t1.JoinColumn = t2.JoinColumn

如果 MyColumnName 仅在表 1 或表 2 中有效,则有效,但会抛出错误 SQL 编译错误:当两个表中都存在列名"MyColumnName"时,该错误列名不明确。我希望能够清除歧义并使用以下内容进行比较:

SET ColName = 'MyColumnName';
SELECT t1.identifier($ColName), t2.identifier($ColName)
FROM db.schema.table1 t1
LEFT JOIN db.schema.table2 t2 
ON t1.JoinColumn = t2.JoinColumn

我还没有找到适用于此的语法变体。大多数变体都会引发错误:"SQL 编译错误:未知的用户定义函数 T1。标识符"。有没有办法解决这个问题?

我遇到了同样的问题,并且能够解决将"ON"替换为"USING"的问题,这会将它们放在输出的同一列中。使用"ON",它想要创建两列,但不能,因为名称相同。

SET ColName = 'MyColumnName';
SELECT t1.identifier($ColName), t2.identifier($ColName)
FROM db.schema.table1 t1
LEFT JOIN db.schema.table2 t2 
USING(JoinColumn)

您也可以考虑对表使用变量:

SET ColName = 'MyColumnName';
SET t1 = 'db.schema.table1';
SET t2 = 'db.schema.table2';
SET t1ColName = $t1 || '.' || $ColName;
SET t2ColName = $t2 || '.' || $ColName;
SELECT identifier($t1ColName), identifier($t2ColName)
FROM  identifier($t1)
LEFT JOIN identifier($t2)
ON identifier($t1).JoinColumn = identifier($t2).JoinColumn

最新更新