在BigQuery中如何正确使用CTE With子句语法?
语法调整解决方案
你遇到的Syntax error: Expected keyword AS but got "(" at [78:14]报错是BigQuery与SQL Server的语法差异导致的,以下是最常见的触发场景和对应修改方案:
- 场景1:VALUES表构造器/派生表的列别名写法不兼容
SQL Server支持在派生表或VALUES构造的临时表后直接加括号定义列名,无需显式声明AS,示例如下:
-- SQL Server 正常运行写法 SELECT * FROM ( VALUES (1, '张三'), (2, '李四') ) t(user_id, user_name)
BigQuery不支持该写法,可调整为以下两种兼容写法:
方式1:使用UNNEST+STRUCT构造数据,内部显式指定列名
-- BigQuery 兼容写法 SELECT * FROM UNNEST([ STRUCT(1 AS user_id, '张三' AS user_name), STRUCT(2 AS user_id, '李四' AS user_name) ])
方式2:派生表内部给列命名,外层仅加表别名
-- BigQuery 兼容写法 SELECT * FROM ( SELECT 1 AS user_id, '张三' AS user_name UNION ALL SELECT 2 AS user_id, '李四' AS user_name ) AS t
- 场景2:省略AS的别名写法识别错误
SQL Server支持部分场景下省略AS声明别名,部分省略写法会被BigQuery误判,示例报错写法:
-- SQL Server可运行,BigQuery报错 SELECT user_id id, user_name name FROM user_table
调整方案为所有别名都显式加AS声明:
-- BigQuery 兼容写法 SELECT user_id AS id, user_name AS name FROM user_table
- 场景3:函数调用的别名写法错误
SQL Server支持部分自定义函数调用的特殊别名格式,BigQuery要求函数调用指定别名时必须在末尾加AS,示例报错写法:
SELECT (split_user_name(user_name)) name_list FROM user_table
调整方案:
SELECT split(user_name, ',') AS name_list FROM user_table
如果以上场景没有覆盖你的代码逻辑,可以贴出第78行前后的代码片段获取更针对性的调整方案。
内容的提问来源于stack exchange,提问作者Ardatnbr
相关产品推荐
相关产品推荐

