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 完全外连接产生“左连接”结果的主要内容,如果未能解决你的问题,请参考以下文章
为啥 data.tables 的 X[Y] 连接不允许完全外连接或左连接?