google-bigquery - 如何查询只能通过另一个查询获得名称的表
问题描述
假设我们在 BigQuery 中有一个糟糕的设计,它不应该以这种方式创建,如下所示:
some_project
contains dataset metadata
,其中包含 table metadata
。样本数据some_project.metadata.metadata
:
| dataset_id |
| xyz1234567 |
| zzz8562042 |
| vyz0009091 |
对于dataset_id
我需要some_table
在这个数据集中查询的每一个,例如some_project.xyz1234567.some_table
.
这是否可以在单个查询中查询这些多个表?我正在寻找每个表的汇总结果。换句话说,我想说的是这样的话:
SELECT SUM(table.x) from table WHERE table IN
(SELECT CONCAT('some_project.', dataset_id, 'some_table') FROM `some_project.metadata.metadata`)
或者
SELECT SUM(table.x) FROM
(SELECT CONCAT('some_project.', dataset_id, 'some_table' as table FROM `some_project.metadata.metadata`)
我知道没有人需要做这样的事情,但我上面描述的设计是我必须使用的。
解决方案
在 BigQuery 循环语句的帮助下,您可以考虑使用临时表作为 SQL 游标替代方法。
您可以逐行读取并执行每个表名的查询。
在这里你可以看到这个例子:
DECLARE var1 INT64 DEFAULT 1;
DECLARE var2 INT64 DEFAULT 0;
DECLARE str1 string DEFAULT '';
DECLARE str2 string DEFAULT '';
DECLARE str3 string DEFAULT '';
CREATE TEMP TABLE temp_emp AS
SELECT empid,
ename,
deptid,
RANK() OVER(ORDER BY empid) rownum
FROM td.emp1;
SET var2= (SELECT COUNT(*) FROM temp_emp);
WHILE var2<=var1 DO
SET str1 = (SELECT empid FROM temp_emp WHERE rownum = x);
SET str2 = (SELECT empid FROM temp_emp WHERE rownum = x);
SET str3 = (SELECT empid FROM temp_emp WHERE rownum = x);
SET var1=var1+1;
END WHILE;
以下是一些需要注意的点。
- 我们正在使用 SET 命令为变量赋值。在原始示例中是 SELECT..INTO。
- 我们没有使用打开和关闭光标。
- 我们正在创建一个 TEMPORARY 表来代替游标声明。
您可以在此链接中查看更多文档。
推荐阅读
- python - 从 selenium IDE 3.1.1.0 导出测试用例
- angular - 错误 TS2304:找不到名称“模块”
- elasticsearch - ElasticSearch / NEST 6 - 在术语查询中将枚举序列化为字符串
- selenium - 如何从子 iframe 切换到主 iframe,然后从主 iframe 切换到普通框架?
- r - 合并两个数据框,替换公共行和列
- c# - 在反射导航属性上添加排序
- python - 正则表达式模式匹配python中的日期时间
- java - Spring DI:聚合或组合
- html - 下面是一个简单的html设计图片
- java - getSupportFragmentManager VS getChildFragmentManager