BigQuery:查询特定 table 的多模式

BigQuery: query multi schemas for a specific table

架构tables:

 1. AA
 2. AB
 3. BB
 4. BA
 5. ...

目标:搜索可以在任何模式中的 table?

所需查询:

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'xyz' and schema_name LIKE '%A'

有效,但需要对所有模式手动重复:

SELECT * FROM AA.INFORMATION_SCHEMA.TABLES WHERE table_name = 'xyz'

您是否在 table_schema 上寻找过滤?我不确定具体的逻辑是什么,也许:

where contains(table_schema, '^[AB]+$')

您应该使用 region qualifier - 在这种情况下,您将获得相应区域中的所有表与默认或指定数据集中的表(如果您分别使用 FROM INFORMATION_SCHEMA.TABLESFROM myDataset.INFORMATION_SCHEMA.TABLES )

因此,对于您的“所需查询”版本,您应该像下面的示例一样简单地添加区域名称(另请注意 table_schema 字段与 schema_name 的使用)

SELECT * 
FROM region-us.INFORMATION_SCHEMA.TABLES 
WHERE table_name = 'xyz' 
AND table_schema LIKE '%A'   

请注意:您需要确保已正确设置 permissions 以查看元数据。例如,我为此添加了 BigQuery 元数据查看器角色

经过一些测试,找到了一种编写 SQL 代码来覆盖请求的方法。

也许有改进的选项。

另一项观察结果令人惊讶,如果 table 存在,则 160 数据库检查需要 3 分钟。

DECLARE dbs ARRAY<STRING>;
DECLARE db STRING;
DECLARE query STRING;
DECLARE table_name STRING;
DECLARE i INT64;

SET dbs = (
  SELECT ARRAY_AGG(schema_name)
  FROM INFORMATION_SCHEMA.SCHEMATA
  WHERE schema_name LIKE '%A'
);

SET i = ARRAY_LENGTH(dbs);

LOOP
  SET i = i - 1;
  SET db = dbs[OFFSET(i)];
  EXECUTE IMMEDIATE FORMAT("""
    SELECT table_name FROM
    `%s.INFORMATION_SCHEMA.TABLES`
    WHERE table_name = 'xyz'""", db) INTO table_name;
  
  IF table_name IS NOT NULL THEN
    IF query IS NULL THEN
      SET query = CONCAT('SELECT * FROM ', db, '.', table_name);
    ELSE SET query = CONCAT(query, ' UNION ALL \nSELECT * FROM ', db, '.', table_name);
    END IF;
  END IF;
  IF i <= 0 THEN
    LEAVE;
  END IF;
END LOOP;

EXECUTE IMMEDIATE query