可以 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_SUFFIX
与 REGEXP_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 有额外的列,您将在结果中看到它们。
我正在尝试 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_SUFFIX
与 REGEXP_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 有额外的列,您将在结果中看到它们。