【发布时间】:2020-01-02 05:22:27
【问题描述】:
第一个查询返回 27384 行。第二个查询返回 142899 行。有人可以解释导致输出差异的 RIGHT JOIN 和 LEFT JOIN 发生了什么吗?
第一次查询:
SELECT u.id AS id,
MIN(q.creation_date) AS q_creation_date,
MIN(a.creation_date) AS a_creation_date
FROM `bigquery-public-data.stackoverflow.posts_questions`AS q
FULL JOIN `bigquery-public-data.stackoverflow.posts_answers` AS a
ON q.owner_user_id = a.owner_user_id
LEFT JOIN `bigquery-public-data.stackoverflow.users` AS u
ON q.owner_user_id = u.id
WHERE u.creation_date >= '2019-01-01'
and u.creation_date < '2019-02-01'
GROUP BY id
第二次查询:
SELECT u.id AS id,
MIN(q.creation_date) AS q_creation_date,
MIN(a.creation_date) AS a_creation_date
FROM `bigquery-public-data.stackoverflow.posts_questions` AS q
FULL JOIN `bigquery-public-data.stackoverflow.posts_answers` AS a
ON q.owner_user_id = a.owner_user_id
RIGHT JOIN `bigquery-public-data.stackoverflow.users` AS u
ON q.owner_user_id = u.id
WHERE u.creation_date >= '2019-01-01' and u.creation_date < '2019-02-01'
GROUP BY id
我预计第一个查询的结果是 142899 行,但我不知道为什么 LEFT JOIN 返回的结果大不相同。
【问题讨论】:
-
x 在 c 上左连接 Y 是在 c 上右连接 X。您认为查询相同的理由是什么?这不只是询问 2 个操作员的工作吗?小的代表性数据向您展示了什么?请在代码问题中给出minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)
-
了解 LEFT/RIGHT JOIN ON 返回的内容:INNER JOIN ON 行 UNION ALL 由 NULL 扩展的不匹配的左/右表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。为什么您的 2 个 FROM 不会产生不同数量的空扩展行?然后:在 LEFT/RIGHT JOIN ON 后需要右/左 [sic] 表列不为 NULL 的 WHERE 或 INNER JOIN ON 删除任何由 NULL 扩展的行,即只留下 INNER JOIN ON 行,即“转 OUTER JOIN进入内部联接”。你有那个。
标签: sql join google-bigquery bigquery-standard-sql