【问题标题】:Difference between 2 queries?2个查询之间的区别?
【发布时间】: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


【解决方案1】:

第一个查询生成的记录集包括“q”的所有记录和“a”的所有记录(如果任一表没有要匹配的数据,数据库将用空值填充这些空单元格)但仅限于'q' 和 'u' 都匹配的记录。

因此,在第一个查询中,记录集基本上受 'u' 中的行限制。查询返回的行数永远不会超过 'u' 中的最大行数。

第二个查询生成的记录集包括“q”的所有记录和“a”的所有记录(如果任一表没有要匹配的数据,数据库将用空值填充这些空单元格)以及 ALL 'u' 的记录(如果任一表没有数据匹配,数据库将用空值填充这些空单元格)。

因此,第二个查询可能会生成一个记录集,其中包含与最大表一样多的行。

【讨论】:

【解决方案2】:

当您使用 RIGHT JOIN 时,具有优先级的表始终位于右侧。同样,LEFT JOIN 优先考虑 JOIN 左侧的表。因此行数不同,优先级表有搜索数据,非优先级表没有所需的组合。更多详情here.

【讨论】:

  • 这使用了无法解释的术语“优先级”。即使已经解释过了,你仍然没有说为什么它在这种情况下会有所不同,所以现在这一切都是“因为左和右连接是如何工作的”。那不是解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2014-06-02
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多