我正在尝试运行类似于以下的查询:
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是一个内联表,所以不能在外连接的外部。”
当将Join从外部更改为Inner时,它可以工作(因此没有语法问题......)。
有人可以解释一下这个消息,我该怎么做才能避免它?
由于
答案 0 :(得分:5)
TL; DR:在内部查询中使用GROUP EACH BY
。
内部查询
Select a, max(x) as b from Tbl1 group by a
不是平行的。您可以并行计算部分结果,但为了了解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
第二个选项是在外部查询上使用JOIN
而不是JOIN EACH
。这可能会遇到大小限制,具体取决于Table2的大小(因为要进行非连接,右侧的表需要为'小'。)。
这无疑是次优的;您必须了解查询引擎的工作方式才能使查询运行。也就是说,我们(在bigquery和dremel团队中)正在努力使查询“正常工作”,这样您就不必处理这类问题。我们在这方面取得了一些进展,在过去几个月中已经删除了许多这类错误(例如,内部联接直到最近才会失败),但我们还有很长的路要走。
感谢您引起我们的注意。我已经提交了一个内部错误,以便我们将来能够更好地完成这项工作。