在BigQuery中无关联列且行数不同的两表连接问题求助
BigQuery无关联列两表连接的查询修正与逻辑分析
原查询的问题
- 语法错误:SELECT子句中各列之间缺少逗号分隔,且语句末尾的冒号应改为分号。
- 逻辑严重不合理:用逗号分隔两个表会生成笛卡尔积,计算下来是1.8亿 × 6500万 = 1.17×10¹⁶行,这会直接导致资源耗尽、查询失败,且几乎没有业务场景需要这种结果。
针对不同需求的合理方案
需求1:纵向合并两表数据(将两表记录放在同一张表的不同行)
如果是要把两个表的记录拼接成一张表的多行,使用UNION ALL,注意补充缺失列的NULL值:
CREATE OR REPLACE TABLE `myproject.mydataset_joinedtable` AS SELECT column1, NULL AS column2, column3, column4 FROM `myproject.mydataset_table1` UNION ALL SELECT NULL AS column1, column2, NULL AS column3, NULL AS column4 FROM `myproject.mydataset_table2`;
此方案总行数为两表行数之和(2.45亿行),符合常规业务场景。
需求2:横向拼接两表数据(按行对应两表记录)
如果确实需要将两表的记录按行横向匹配,需给每个表添加行号后关联,建议用FULL OUTER JOIN保留所有行:
CREATE OR REPLACE TABLE `myproject.mydataset_joinedtable` AS SELECT t1.column1, t2.column2, t1.column3, t1.column4 FROM ( SELECT *, ROW_NUMBER() OVER() AS row_num FROM `myproject.mydataset_table1` ) t1 FULL OUTER JOIN ( SELECT *, ROW_NUMBER() OVER() AS row_num FROM `myproject.mydataset_table2` ) t2 ON t1.row_num = t2.row_num;
注意:ROW_NUMBER() OVER()未指定排序时,行顺序不固定,若需要固定对应关系,需在OVER()中添加ORDER BY子句(如ORDER BY column1)。此方案总行数为两表中的最大行数(1.8亿行),行数较少的表超出部分对应列会填充为NULL。
内容的提问来源于stack exchange,提问作者sa657
相关产品推荐
相关产品推荐

