2个查询之间的区别?
Difference between 2 queries?
第一个查询 returns 27384 行。第二个查询 returns 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.Whosebug.posts_questions`AS q
FULL JOIN `bigquery-public-data.Whosebug.posts_answers` AS a
ON q.owner_user_id = a.owner_user_id
LEFT JOIN `bigquery-public-data.Whosebug.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.Whosebug.posts_questions` AS q
FULL JOIN `bigquery-public-data.Whosebug.posts_answers` AS a
ON q.owner_user_id = a.owner_user_id
RIGHT JOIN `bigquery-public-data.Whosebug.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 returns 结果大不相同。
当您使用 RIGHT JOIN 时,优先的 table 始终是右边的那个。同样,LEFT JOIN 优先考虑 JOIN 左侧的 table。因此行数的不同在于优先级table有搜索数据,非优先级table没有所需的组合。更多详情 here.
第一个查询生成的记录集包括 'q' 的所有记录和 'a' 的所有记录(如果 table 没有数据匹配,数据库将用空值填充这些空单元格)但仅限于 'q' 和 'u' 都匹配的记录。
因此,在第一个查询中,记录集基本上受限于'u'中的行。查询绝不会 return 超过 'u'.
中的最大行数
第二个查询生成的记录集包括 'q' 的所有记录和 'a' 的所有记录(如果 table 没有数据匹配,数据库将用空值填充这些空单元格)以及 'u' 的所有记录(如果 table 没有数据匹配,数据库将用空值填充这些空单元格)。
因此,第二个查询可能会生成一个记录集,其行数与最大行数一样多 table。
第一个查询 returns 27384 行。第二个查询 returns 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.Whosebug.posts_questions`AS q
FULL JOIN `bigquery-public-data.Whosebug.posts_answers` AS a
ON q.owner_user_id = a.owner_user_id
LEFT JOIN `bigquery-public-data.Whosebug.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.Whosebug.posts_questions` AS q
FULL JOIN `bigquery-public-data.Whosebug.posts_answers` AS a
ON q.owner_user_id = a.owner_user_id
RIGHT JOIN `bigquery-public-data.Whosebug.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 returns 结果大不相同。
当您使用 RIGHT JOIN 时,优先的 table 始终是右边的那个。同样,LEFT JOIN 优先考虑 JOIN 左侧的 table。因此行数的不同在于优先级table有搜索数据,非优先级table没有所需的组合。更多详情 here.
第一个查询生成的记录集包括 'q' 的所有记录和 'a' 的所有记录(如果 table 没有数据匹配,数据库将用空值填充这些空单元格)但仅限于 'q' 和 'u' 都匹配的记录。
因此,在第一个查询中,记录集基本上受限于'u'中的行。查询绝不会 return 超过 'u'.
中的最大行数第二个查询生成的记录集包括 'q' 的所有记录和 'a' 的所有记录(如果 table 没有数据匹配,数据库将用空值填充这些空单元格)以及 'u' 的所有记录(如果 table 没有数据匹配,数据库将用空值填充这些空单元格)。
因此,第二个查询可能会生成一个记录集,其行数与最大行数一样多 table。