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

Posted

技术标签:

【中文标题】BigQuery 完全外连接产生“左连接”结果【英文标题】:BigQuery Full outer join producing "left join" results 【发布时间】:2017-01-20 02:24:19 【问题描述】:

我有 2 个表,它们都包含不同的 id 值。某些 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 行。

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

【问题讨论】:

您尝试过我下面建议的#standardSQL 吗? - 了解结果有助于进一步“排除故障” 【参考方案1】:

当您使用 EACH 时 - 看起来您正在以旧版 SQL 模式运行查询。 在 BigQuery 旧版 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

【讨论】:

SELECT EXACT_COUNT_DISTINCT(a.id) FROM table1 a FULL OUTER JOIN EACH table2 b on a.id = b.id 这也返回了 10,896。我还尝试只选择没有聚合的单个 id 列,但仍然收到 10,896 行【参考方案2】:

我将原始查询添加为子查询并计算 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))

【讨论】:

这听起来像是一个问题/错误,您可以在code.google.com/p/google-bigquery 报告【参考方案3】:

这是因为您在这两种情况下都使用计数(不同的 a.id)来计算表 a 的非空行数。 使用 count(*),它应该可以工作。

【讨论】:

以上是关于BigQuery 完全外连接产生“左连接”结果的主要内容,如果未能解决你的问题,请参考以下文章

MySql表的内连和外连

外连接合并列

多表查询

为啥 data.tables 的 X[Y] 连接不允许完全外连接或左连接?

SQL Server内连接左外连接右外连接完全连接交叉lianjie

mysql内连接和外连接的区别