第一个查询返回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返回的结果大不相同。
答案 0 :(得分:0)
当您使用RIGHT JOIN时,优先级表始终位于右侧。同样,LEFT JOIN会优先考虑JOIN左侧的表格。因此,行数不同,因为优先级表具有搜索数据而非优先级表不具有所需的组合。更多详细信息here。
答案 1 :(得分:0)
由第一个查询生成的记录集包括所有“ q”记录和所有“ a”记录(并且其中任何一个表都没有要匹配的数据,则数据库将使用空值填充这些空单元格)但仅限于记录“ q”和“ u”都匹配的地方。
因此,在第一个查询中,记录集基本上受“ u”中的行的限制。查询将永远不会返回'u'中的最大行数。
第二个查询产生的记录集包括所有“ q”记录和所有“ a”记录(并且其中任何一个表都没有要匹配的数据,数据库将用空值填充那些空单元格)并且还全部记录“ u”(并且其中任何一个表都没有要匹配的数据,数据库将使用空值填充这些空单元格。)
因此,第二个查询可能会产生一个记录集,该记录集的行数与最大的表一样多。