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.TABLES
或 FROM 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
架构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.TABLES
或 FROM 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