Redshift从临时表插入数据报错:syntax error at or near 'as'
修复Redshift INSERT语句的语法错误:从CTE/临时表插入数据
你遇到的这个语法错误,是因为Redshift(遵循标准SQL语法)不允许把CTE(WITH子句)放在INSERT INTO的括号里面。咱们来一步步修正:
错误的原语句
Insert into schema.table1 ( with a as ( select t1.country_code, t1.country_name from t1 ) select * from a );
修正后的写法(针对CTE的情况)
把WITH子句移到INSERT INTO之后、SELECT语句之前,正确的语法结构应该是这样:
WITH a AS ( SELECT t1.country_code, t1.country_name FROM t1 ) INSERT INTO schema.table1 (country_code, country_name) SELECT * FROM a;
或者更简洁的版本(如果字段顺序和目标表完全匹配的话):
INSERT INTO schema.table1 WITH a AS ( SELECT t1.country_code, t1.country_name FROM t1 ) SELECT * FROM a;
如果是已经创建好的临时表(不是CTE)
如果你确实是用CREATE TEMP TABLE预先创建了临时表,那直接简化成下面的写法就行,完全不需要WITH子句:
INSERT INTO schema.table1 (country_code, country_name) SELECT country_code, country_name FROM your_temp_table;
额外小提示
- 尽量显式指定插入的字段列表(比如上面的
(country_code, country_name)),这样即使目标表结构后续有变化,也能避免意外错误,代码可读性也更强。 - Redshift里的CTE是临时查询块,和预先创建的临时表是不同概念:CTE只在当前语句生效,而临时表会在会话周期内存在,按需选择即可。
内容的提问来源于stack exchange,提问作者jumpman23
相关产品推荐
相关产品推荐

