【问题标题】:BigQuery - Correlated subquery over union not workingBigQuery - 联合上的相关子查询不起作用
【发布时间】: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

【问题讨论】:

    标签: google-bigquery


    【解决方案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 在针对联接运行相关子查询时会出现问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多