2个查询之间的区别?

时间:2019-08-29 00:42:42

标签: sql join google-bigquery bigquery-standard-sql

第一个查询返回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返回的结果大不相同。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

由第一个查询生成的记录集包括所有“ q”记录和所有“ a”记录(并且其中任何一个表都没有要匹配的数据,则数据库将使用空值填充这些空单元格)但仅限于记录“ q”和“ u”都匹配的地方。

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

第二个查询产生的记录集包括所有“ q”记录和所有“ a”记录(并且其中任何一个表都没有要匹配的数据,数据库将用空值填充那些空单元格)并且还全部记录“ u”(并且其中任何一个表都没有要匹配的数据,数据库将使用空值填充这些空单元格。)

因此,第二个查询可能会产生一个记录集,该记录集的行数与最大的表一样多。