首页 > 解决方案 > 如何查询只能通过另一个查询获得名称的表

问题描述

假设我们在 BigQuery 中有一个糟糕的设计,它不应该以这种方式创建,如下所示: some_projectcontains 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`)

我知道没有人需要做这样的事情,但我上面描述的设计是我必须使用的。

标签: google-bigquery

解决方案


在 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 表来代替游标声明。

您可以在此链接中查看更多文档。


推荐阅读