BigQuery - 联合上的相关子查询不起作用

Posted

技术标签:

【中文标题】BigQuery - 联合上的相关子查询不起作用【英文标题】:BigQuery - Correlated subquery over union not working 【发布时间】:2019-05-22 07:38:19 【问题描述】:

在联合上运行简单的相关子查询(如下)时出现错误:

不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。

如果我删除联合,查询工作正常。没有联合如何获得相同的结果?

with data as (


 select * from `bigquery-public-data.samples.shakespeare` 
  union all 
  select * from `bigquery-public-data.samples.shakespeare` 

)

select
   *,
   (select count(*) from data where word = d.word) word_count_2
from `bigquery-public-data.samples.shakespeare` d

【问题讨论】:

【参考方案1】:

不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。

作为错误状态,WITH 对象中的 UNION 存在问题。

由于我看不到在表上与自身进行联合的逻辑,因此一个简单的解决方案是像这样删除 UNION

with data as (
 select * from `bigquery-public-data.samples.shakespeare` 
)

select
   *,
   (select count(*) from data where word = d.word) word_count_2
from `bigquery-public-data.samples.shakespeare` d

产生这些结果的原因

【讨论】:

我并没有真正尝试运行自己的表的联合。这只是公共数据的一个例子,所以我可以分享。请假设加入是有意义的。 感谢 Lior,如果示例有意义,UNION 将起作用。请努力提供一个真实的问题查询,以便更容易帮助您 无论具体数据如何,联合都将不起作用。在发布问题之前,我对我的数据进行了尝试。我无法发布我的原始数据。我认为基本问题很清楚。 这是一个有效的 SQL,您可以使用with data as ( select 'LVII' as word, 1 as word_count, 'sonnets' as corpus, 0 as corpus_date union all select 'augurs' as word, 1 as word_count, 'sonnets' as corpus, 0 as corpus_date ) select *, (select count(*) from data where word = d.word) word_count_2 from bigquery-public-data.samples.shakespeare` d order by word_count_2 desc` 来玩。 谢谢。我将等待 Google 工程师回答为什么该查询不适用于真实表(非内联)【参考方案2】:

基于强制 BigQuery 重新计算联合表的 hacky 解决方案:

with data as (
 select * from `bigquery-public-data.samples.shakespeare` 
  union all 
  select * from `bigquery-public-data.samples.shakespeare` 

), data_reshuffled as (
 SELECT d.*
 FROM (
   SELECT ANY_VALUE(d) d
   FROM (
     SELECT GENERATE_UUID() uuid, d
     FROM data d
   )
   GROUP BY uuid
 )
)

select
   *,
   (select count(*) from data_reshuffled where word = d.word) word_count_2
from `bigquery-public-data.samples.shakespeare` d

【讨论】:

谢谢。为什么 BigQuery 在针对联接运行相关子查询时会出现问题?

以上是关于BigQuery - 联合上的相关子查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL - 多级相关子查询不起作用

当相关子查询不起作用时,压缩子查询

bigquery:依靠子查询的联合

BigQuery - 缓存可能不起作用。我该如何诊断?

BigQuery 相关子查询 - 将数组转换为数组

BigQuery 中使用引用另一个表的 UDF 的相关子查询错误