可以 SELECT * FROM 具有相同 _TABLE_SUFFIX 模式的多个表

Can SELECT * FROM multiple tables with same _TABLE_SUFFIX pattern

我正在尝试 select * 3 个表中匹配 TABLE_SUFFIX 模式的行,问题是我没有收到预期的输出。

我正在使用的查询:

SELECT
 *
FROM
 `project-id.airbyte_google_ads.client_id_*`
WHERE
  REGEXP_CONTAINS(_TABLE_SUFFIX, r"_campaign_performance_overview$")

收到的输出包含其他表的列,而不是我想要的列,但如果我使用:

SELECT
  DISTINCT _TABLE_SUFFIX as tables
FROM
  `project-id.airbyte_google_ads.client_id_*`
WHERE
  REGEXP_CONTAINS(_TABLE_SUFFIX, r"_campaign_performance_overview$")

我想从中提取 select 行的表名是正确的。

我的想法是通配符行出了点问题,我想知道是否可以通过某种方式使用它,例如:

`project-id.airbyte_google_ads.client_id_*_campaign`

或类似的东西,因为看起来查询在 FROM 语句中做了一些事情,并且在不同的点做了 WHERE 中的内容。

让我知道你在这方面有什么困难。 感谢您的宝贵时间!

根据这个 documentation,当使用通配符 tables 时,数据集中以 * 之前的 table 名称开头的所有 tables 甚至被扫描如果 _TABLE_SUFFIXREGEXP_CONTAINS 结合使用。在我们的例子中,通配符模式是 client_id_*,因此,无论 REGEXP_CONTAINS.

中的模式如何,client_id_1_campaigns 等值也会匹配

此行为的原因是,通配符模式先于正则表达式并扫描所有匹配通配符模式的 table,而不考虑正则表达式。在使用 REGEXP_CONTAINS 的同时使用通配符是在正则表达式之上应用正则表达式,不推荐这样做。

如果您希望获得预期的目标 tables,您将需要使用以下查询而不是使用通配符来查询多个 tables。

SELECT *
FROM (
SELECT * FROM `project-id.dataset-id.client_id_2_campaign_performance_overview` UNION ALL
SELECT * FROM `project-id.dataset-id.client_id_7_campaign_performance_overview` UNION ALL
SELECT * FROM `project-id.dataset-id.client_id_10_campaign_performance_overview`);

使用 LIKE 运算符也没有给出预期的结果,原因与上述相同。首先扫描 table,然后过滤,在结果中提供额外的列。

此外,BigQuery 使用与通配符匹配的最近创建的 table 的架构作为通配符 table 的架构。即使您使用 WHERE 子句中的 _TABLE_SUFFIX 伪列限制了通配符 table 中要使用的 table 的数量,BigQuery 也会使用最近创建的 table 匹配通配符。如果最近创建的 table 有额外的列,您将在结果中看到它们。