假设我们在BigQuery中有一个糟糕的设计,它本不应该以这种方式创建,如下所示:some_project
包含数据集metadata
,该数据集包含表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命令为变量赋值。是的选择。。INTO
- 我们没有使用打开和关闭光标
- 我们正在创建一个TEMPORARY表来代替游标声明
您可以在此链接中查看更多文档。
试试这个
declare sql string;
set sql = (
select concat("Select something from
someproject.",datasetid,".sometable"
) from metadata.metadata);
execute immediate sql
执行立即