Snowflake SQL使用表别名时无法排除或重命名列的问题
问题说明
以下Snowflake查询可正常执行:
示例1
SELECT * EXCLUDE company_name FROM employee
示例2
SELECT * RENAME id as emp_id FROM employee
但使用表别名时会触发SQL编译错误,尤其是多表连接遇到列歧义时,尝试用表别名限定列名会报错:
示例1(报错)
SELECT * EXCLUDE t1.company_name FROM employee t1
示例2(报错)
SELECT * RENAME t1.id as emp_id FROM employee t1
SQL编译错误: 第1行第18位置出现语法错误,意外的 '.'
解决方法
单表场景
使用表别名时,* EXCLUDE/* RENAME后直接写列名即可,不需要加表别名前缀——*已经指代了当前表的所有列:
-- 正确写法:排除company_name SELECT * EXCLUDE company_name FROM employee t1; -- 正确写法:重命名id为emp_id SELECT * RENAME id as emp_id FROM employee t1;
多表连接(列歧义)场景
如果多表连接导致列名重复(比如多个表都有company_name),需要明确指定操作的是哪个表的列集合,此时要把表别名和*绑定,后续的列名仍无需加别名:
-- 连接时排除t1的company_name,保留t2的company_name SELECT t1.* EXCLUDE company_name, t2.* FROM employee t1 JOIN department t2 ON t1.dept_id = t2.id; -- 连接时将t1的id重命名为emp_id SELECT t1.* RENAME id as emp_id, t2.* FROM employee t1 JOIN department t2 ON t1.dept_id = t2.id;
Snowflake的* EXCLUDE/* RENAME语法规则是:*可以和表别名组合(如t1.*),但EXCLUDE/RENAME针对的是前面*对应的列集合,因此后续列名不需要再加表别名限定。
内容的提问来源于stack exchange,提问作者Sayed Mohd Ali
相关产品推荐
相关产品推荐

