BigQuery是否支持结合SQL WITH子句进行多表关联查询?
BigQuery支持用WITH子句实现多表关联吗?
当然支持,WITH子句(即公共表表达式CTE)在BigQuery里完全可以用来定义可复用的子查询,再基于这些CTE完成多表关联,刚好能解决你重复编写相同查询的问题。
先纠正你示例代码里的几个小问题:
- 定义
t2的SELECT语句末尾多了个冗余逗号(tab3, from t2) t3的SELECT列数与GROUP BY列数不匹配(SELECT是tab1, tab2,GROUP BY却写了3列)- 关联查询里的
a.tabl是拼写错误,应为a.tab1 b. tab3里多了不必要的空格
下面是修正后的完整示例,用WITH子句封装所有需要的子表,还能把关联逻辑也打包成可复用的CTE:
-- 定义可复用的基础子表CTE WITH t1_cte AS ( SELECT tab1, tab2 FROM t1 GROUP BY 1, 2 ), t2_cte AS ( SELECT tab1, tab2, tab3 FROM t2 GROUP BY 1, 2, 3 ), t3_cte AS ( SELECT tab1, tab2 FROM t3 GROUP BY 1, 2 -- 修正为与SELECT列数一致 ), -- 把关联逻辑封装成CTE,方便重复调用 joined_result AS ( SELECT a.tab1, a.tab2, b.tab1 AS b_tab1, b.tab3, c.tab1 AS c_tab1, c.tab2 AS c_tab2 FROM t1_cte a LEFT JOIN t2_cte b ON a.tab1 = b.tab1 AND a.tab2 = b.tab2 -- 原条件写a.tab2 = b.tab3,若为业务需求可保留,此处按合理关联修正 LEFT JOIN t3_cte c ON a.tab1 = c.tab1 ) -- 第一次调用关联结果 SELECT * FROM joined_result; -- 第二次调用,无需重复编写关联逻辑 SELECT * FROM joined_result;
说明:
- 每个子查询通过WITH定义为CTE后,主查询可像引用普通表一样调用它们
- 如果需要多次复用相同的关联结果,把关联逻辑也封装成CTE(比如上面的
joined_result),后续直接查询该CTE即可,彻底避免代码重复 - BigQuery对CTE的支持非常完善,单级、多级CTE都能正常解析执行
内容的提问来源于stack exchange,提问作者solomon paul
相关产品推荐
相关产品推荐

