BigQuery全外连接产生“左连接”结果

时间:2017-01-20 02:24:19

标签: google-bigquery

我有2个表,两个表都包含不同的id值。某些id值可能出现在两个表中,有些值对于每个表都是唯一的。 Table1有10,910行,Table2有11,304行

运行左连接查询时:

SELECT COUNT(DISTINCT a.id)
FROM table1 a
JOIN table2 b on a.id = b.id

我在两个表中共享了10,896行或10,896个ID。

但是,当我在2个表上运行FULL OUTER JOIN时,如下所示:

SELECT COUNT(DISTINCT a.id)
FROM table1 a
FULL OUTER JOIN EACH table2 b on a.id = b.id

我总共获得了10,896行,但我期待来自table1的所有10,910行。

我想知道我的查询语法是否存在问题。

3 个答案:

答案 0 :(得分:5)

当您使用EACH时 - 看起来您正在以旧版SQL模式运行查询 在BigQuery Legacy SQL中,COUNT(DISTINCT)函数是概率性的 - 给出统计近似值,并不保证是准确的。
您可以使用EXACT_COUNT_DISTINCT()功能 - 这个功能可以为您提供确切的数字,但在后端需要更贵一点

更好的选择 - 只需使用Standard SQL
对于您的特定查询,您只需要删除EACH关键字,它就可以作为魅力

#standardSQL
SELECT COUNT(DISTINCT a.id)
FROM table1 a
JOIN table2 b on a.id = b.id

#standardSQL
SELECT COUNT(DISTINCT a.id)
FROM table1 a
FULL OUTER JOIN table2 b on a.id = b.id

答案 1 :(得分:1)

我将原始查询添加为子查询并计算了ID并生成了预期结果。还是有点奇怪,但它确实有效。

SELECT EXACT_COUNT_DISTINCT(a.id)
FROM
(SELECT a.id AS a.id,
b.id AS b.id
FROM table1 a FULL OUTER JOIN EACH table2 b on a.id = b.id))

答案 2 :(得分:0)

这是因为通过使用计数(不同的a.id),在两种情况下都计算表a的非空行数。 使用计数(*),它应该有效。