首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以从具有相同_TABLE_SUFFIX模式的多个表中选择*

可以从具有相同_TABLE_SUFFIX模式的多个表中选择*
EN

Stack Overflow用户
提问于 2022-04-01 10:17:15
回答 1查看 585关注 0票数 0

我试图从3个匹配TABLE_SUFFIX模式的表中选择*行,问题是我没有收到预期的输出。

我使用的查询:

代码语言:javascript
复制
SELECT
 *
FROM
 `project-id.airbyte_google_ads.client_id_*`
WHERE
  REGEXP_CONTAINS(_TABLE_SUFFIX, r"_campaign_performance_overview$")

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

代码语言:javascript
复制
SELECT
  DISTINCT _TABLE_SUFFIX as tables
FROM
  `project-id.airbyte_google_ads.client_id_*`
WHERE
  REGEXP_CONTAINS(_TABLE_SUFFIX, r"_campaign_performance_overview$")

要从中选择行的表名是正确的。

我的看法是,通配符行有问题,如果有什么方法可以使用它,比如:

代码语言:javascript
复制
`project-id.airbyte_google_ads.client_id_*_campaign`

或者类似的东西,因为看起来像查询在FROM语句上做了一些事情,并且在不同的地方做了一些事情。

告诉我你对这件事的看法是什么。谢谢您抽时间见我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 14:42:08

根据此文档,在使用通配符表时,即使将_TABLE_SUFFIXREGEXP_CONTAINS结合使用,数据集中以表名*开头的所有表也会被扫描。在我们的例子中,通配符模式是client_id_*,因此,与REGEXP_CONTAINS中的模式无关,client_id_1_campaigns之类的值也是匹配的。

造成这种行为的原因是,通配符模式先于正则表达式并扫描所有匹配通配符模式的表,并且不会考虑正则表达式。使用通配符同时也使用REGEXP_CONTAINS是在regex之上应用regex,不建议这样做。

如果希望有预期的目标表,则需要使用下面的查询,而不是使用通配符来查询多个表。

代码语言:javascript
复制
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运算符也不会给出预期的结果。首先扫描这些表,然后对其进行过滤,在结果中提供额外的列。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71705354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档