"我的别名"是一个内联表,因此不能位于外连接的外部

N.N*_*.N. 6 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
Run Code Online (Sandbox Code Playgroud)

我得到"Table1是一个内联表,所以不能在外连接的外部."

当将Join从外部更改为Inner时,它可以工作(因此没有语法问题......).

有人可以解释这个消息,我应该做些什么来避免它?

谢谢

Jor*_*ani 5

TL; DR:GROUP EACH BY在内部查询中使用.

内部查询

Select a, max(x) as b from Tbl1  group by a 
Run Code Online (Sandbox Code Playgroud)

不是平行的.您可以并行计算部分结果,但是为了知道'的max(x)每个值的全局a,您需要只在一个地方运行.JOIN EACH在外部查询中使用时,您将指示需要并行JOIN执行的查询引擎.但是,您没有可兼容的源,因此查询失败.

有两种方法可以解决这个问题:第一种方法是使用内部查询的显式并行版本 - 只需使用GROUP EACH BY而不是GROUP BY.这可以并行执行,因为第一步是按字段对基础表进行排序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
Run Code Online (Sandbox Code Playgroud)

第二个选项是使用JOIN而不是JOIN EACH外部查询.这可能会遇到大小限制,具体取决于Table2的大小(因为要进行非每个连接,右侧的表需要为'小'.).

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

谢谢让我们注意到这个.我已经提交了一个内部错误,以便我们将来可以更好地完成这项工作.