SQL中执行JOIN关联时能否使用SELECT *避免重复列名报错?
Snowflake关联查询避免手动枚举全列的解决方案
该报错由两张表存在同名字段导致,直接执行SELECT *会返回重复列名触发编译失败,Snowflake原生支持以下三种方案,无需手动指定所有查询列:
- 排除指定重复列
如果不需要保留两张表的重复字段,直接使用EXCLUDE关键字剔除其中一张表的重复列即可,示例语法如下:
-- 假设关联键为id,保留b表的id,剔除a表的id SELECT a.* EXCLUDE (id), b.* FROM 表A a JOIN 表B b ON a.id = b.id
存在多个重复字段时,直接在EXCLUDE后的括号内传入字段列表即可,例如EXCLUDE (id, create_time, update_time)。
- 自动给列加表前缀区分重名
如果需要保留两张表的所有同名字段,可以给通配符加别名前缀,Snowflake会自动为所有返回列加上指定前缀避免重名,示例语法如下:
-- a表列名统一加a_前缀,b表列名统一加b_前缀 SELECT a.* AS "a_*", b.* AS "b_*" FROM 表A a JOIN 表B b ON a.id = b.id
- 动态生成查询列脚本
如果是列数极多、表结构频繁修改的场景,可以通过元数据表自动生成查询字段列表,示例脚本如下:
-- 生成表A除关联键id之外的所有查询字段 SELECT LISTAGG('a.'||COLUMN_NAME, ', ') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TABLE_A' AND COLUMN_NAME != 'id';
将脚本返回的字段字符串替换到你的查询语句中即可,无需手动整理列名。
内容的提问来源于stack exchange,提问作者Ezer K
相关产品推荐
相关产品推荐

