不支持引用其他表的相关子查询

Posted

技术标签:

【中文标题】不支持引用其他表的相关子查询【英文标题】:Correlated subqueries that reference other tables are not supported 【发布时间】:2018-01-08 15:14:14 【问题描述】:

我有数百个查询为我公司的仪表板提供动力,这些查询已经工作了多年,但几天前一夜之间崩溃了,给出了错误:

错误:,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。

以下是存在问题的查询类型示例。显然 WHERE 条件是问题所在。真的不再支持这种类型的查询吗?现在是否需要将所有使用此语法的查询转换为使用 INNER JOIN?这是一个巨大的变化,真正影响了我们的分析。

-- standardSQL
SELECT 
  accounts,
  monthly_timestamp
FROM 
  `custom_query_ingestion.accounts_monthly`
WHERE 
  monthly_timestamp <= (SELECT MAX(TIMESTAMP(date)) FROM `historical_data.historical_revenue`) 

【问题讨论】:

对于这样的问题,您最好为 BQ 工程团队创建一个公共问题跟踪器,并在此处引用链接。您可以使用问题跟踪器获得更快的答案。如果仍然有,您应该为这两种情况添加示例作业 ID。 issuetracker.google.com/savedsearches/559654 谢谢,我会的。我仍然无法确定这是否是一个错误,或者 BigQuery 是否真的不再希望支持使用这种语法的查询 @StephanieG 我不是 BigQuery 专家,但您可以将此查询重写为与找到最大时间戳的子查询的交叉联接。可能不是最好的解决方案,但也许可以尝试一下。 Stephanie posted the bug on the issue tracker,BigQuery 团队的人员应该能够帮助解决问题。 @StephanieG 我看到你是新来的。在下面发布为答案,几天后您可以标记为答案。 【参考方案1】:

问题是history_revenue 中未嵌套的数组常量的左连接:

LEFT JOIN (
  SELECT 
    product
  FROM 
    UNNEST(['Item1','Item2','Item3']) AS product
) AS nonrecurring
ON nonrecurring.product = revenue.product_item

重写为 CASE WHEN 语句解决了问题

【讨论】:

以上是关于不支持引用其他表的相关子查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Join 的情况下处理引用其他表的相关子查询的问题

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

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

AWS Athena:不支持的相关子查询类型,但它适用于 Mysql 和其他风格

由于内部错误,不支持相关子查询模式 - 不存在相关子查询

不支持的子查询表达式“时尚”:子查询表达式仅引用外部查询表达式