【问题标题】:BigQuery: query multi schemas for a specific tableBigQuery:查询特定表的多模式
【发布时间】:2021-03-26 11:01:10
【问题描述】:

架构表:

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

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

所需查询:

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

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

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

【问题讨论】:

    标签: sql google-bigquery information-schema


    【解决方案1】:

    您应该使用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 元数据查看者角色

    【讨论】:

    • 感到惊讶的是,即使我是项目的所有者,也需要添加额外的查看者角色。知道为什么默认情况下不可用。
    【解决方案2】:

    您是否正在寻找对table_schema 的过滤?我不确定确切的逻辑是什么,也许:

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

    【讨论】:

      【解决方案3】:

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

      也许有改进的选择。

      另一个观察结果令人惊讶的是,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
      

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 2016-12-25
        • 1970-01-01
        相关资源
        最近更新 更多