【发布时间】:2015-12-30 15:50:15
【问题描述】:
这是我的谜团。在控制台上,当我计算这个查询时,它运行得非常好:
SELECT rd.ds_id AS ds_id
FROM (SELECT ds_id, 1 AS dummy FROM bq_000010.table) rd
INNER JOIN EACH (SELECT 1 AS dummy) cal ON (cal.dummy = rd.dummy);
然后我将它保存为一个名为 dataset.myview 的视图,然后运行:
SELECT * FROM dataset.myview LIMIT 1000
但这会引发以下错误:
SELECT 查询引用非常量字段或使用聚合 功能或具有 WHERE、OMIT IF、GROUP BY、ORDER BY 中的一项或多项 子句必须有 FROM 子句。
尽管如此,当我尝试:SELECT * FROM dataset.myview,即没有LIMIT 时,它可以工作!!
事实上,当我在底部使用 LIMIT 运行完整查询时,它也会引发错误:
SELECT rd.ds_id AS ds_id
FROM (SELECT ds_id, 1 AS dummy FROM bq_000010.table) rd
INNER JOIN EACH (SELECT 1 AS dummy) cal ON (cal.dummy = rd.dummy) LIMIT 1000;
尽管如此,当我添加一个内部 ORDER BY 时,它再次计算得很好:
SELECT rd.ds_id AS ds_id
FROM (SELECT ds_id,
1 AS dummy
FROM bq_000010.000010_flux_visites_ds
ORDER BY ds_id) rd
INNER JOIN EACH (SELECT 1 AS dummy) cal ON (cal.dummy = rd.dummy) LIMIT 1000
【问题讨论】:
-
如果您将订单依据应用于视图上的选择,会发生什么?还是您需要随机结果? A query with a LIMIT clause may still be non-deterministic if there is no operator in the query that guarantees the ordering of the output result set. This is because BigQuery executes using a large number of parallel workers. The order in which parallel jobs return is not guaranteed. 注意:不是视图本身,而是针对视图的选择。
-
我更新了我的帖子,但我不明白发生了什么。
-
我自己也不确定。看到没有任何顺序的限制通常很奇怪;这就是为什么我询问订单的原因。 a complete SWAG 可能是并行工作者在内部选择完成之前完成了外部连接和限制,导致内部错误;并且通过系统应用命令,在执行内部连接之前强制实现记录。但我真的有~~NO CLUE~~
-
所以我使用您的建议修复了我的查询,现在可以了,您可以发布答案,或者我将关闭问题。再次感谢您。
-
无论如何,由于我的回答不是根本原因,我可以关闭,但如果您认为这可能对其他人有利,那么在不完全理解根本案例的情况下接受答案也可能是合理的。跨度>
标签: sql views google-bigquery