Google bigquery &引用;我的别名;是内联表,因此不能位于外部联接的外部部分

Google bigquery &引用;我的别名;是内联表,因此不能位于外部联接的外部部分,google-bigquery,Google Bigquery,我正在尝试运行类似以下内容的查询: Select Table1.a,Table1.b,Table2.c From (Select a, max(x) as b from Tbl1 group by a ) as Table1 LEFT JOIN EACH Table2 ON Join Condition 我得到“Table1是一个内联表,因此不能位于外部联接的外部部分。” 将联接从外部更改为内部时,它会工作(因此没有语法问题…) 有人能解释一下这个信息吗?我应该做些什么来避免它 谢谢TL

我正在尝试运行类似以下内容的查询:

Select Table1.a,Table1.b,Table2.c
From 
(Select a, max(x) as b
from Tbl1 
group by a
) as Table1
LEFT JOIN EACH Table2
ON 
Join Condition
我得到“Table1是一个内联表,因此不能位于外部联接的外部部分。”

将联接从外部更改为内部时,它会工作(因此没有语法问题…)

有人能解释一下这个信息吗?我应该做些什么来避免它


谢谢

TL;DR:在内部查询中使用
按每个人分组

内部查询

Select a, max(x) as b from Tbl1  group by a 
不可平行准直。您可以并行计算部分结果,但为了知道
a
的每个值的全局
max(x)
,您只需要在一个位置运行该值。在外部查询中使用
JOIN EACH
时,您指示查询引擎需要并行执行
JOIN
。但是,您没有可并行化的源,因此查询失败

有两种方法可以解决这个问题:第一种是使用内部查询的显式并行版本——只需使用
groupby
而不是
groupby
。这可以并行执行,因为第一步是按
a
字段对基础表进行排序,以便可以计算并行工作程序中每个
a
字段的全局最大值。如果内部查询是并行的,那么外部查询也可以并行执行。这看起来像:

Select Table1.a,Table1.b,Table2.c
From 
(Select a, max(x) as b
from Tbl1 
group EACH by a -- note the EACH keyword here
) as Table1
LEFT JOIN EACH Table2
ON 
Join Condition
第二个选项是在外部查询中使用
JOIN
而不是
JOIN EACH
。这可能会遇到大小限制,具体取决于表2的大小(因为要进行非每次连接,右侧的表必须是“小的”)

这无疑是次优的;您必须了解查询引擎如何工作,才能运行查询。也就是说,我们(bigquery和dremel团队)正在努力使查询“正常工作”,这样您就不必处理此类问题。我们在这方面取得了一些进展,在过去的几个月里已经消除了许多此类错误(例如,直到最近,内部连接也会失败),但我们还有一段路要走

谢谢你让我们注意到这一点。我已经提交了一个内部bug,以便我们能够在将来更好地工作