我正在尝试在 BigQuery 中加入两个表:
SELECT MU.C FROM MU
INNER JOIN EACH MM
ON MU.C = MM.P_C;
MU 有大约 700 万条记录,而 MM 有 4500 万条记录。我想在 MU 中找到与 MM 匹配的记录。
由于尺寸大,我不能使用 INNER JOIN。但是 INNER JOIN EACH 给了我 2.39 亿条记录的结果。
我究竟做错了什么?
我正在尝试在 BigQuery 中加入两个表:
SELECT MU.C FROM MU
INNER JOIN EACH MM
ON MU.C = MM.P_C;
MU 有大约 700 万条记录,而 MM 有 4500 万条记录。我想在 MU 中找到与 MM 匹配的记录。
由于尺寸大,我不能使用 INNER JOIN。但是 INNER JOIN EACH 给了我 2.39 亿条记录的结果。
我究竟做错了什么?
join 的语义是当同一键在连接的每一侧多次匹配时,您将获得连接键的叉积。在最坏的情况下,您最终可能会得到 N * M 行,其中 N 是左侧的表数,M 是右侧的表数。
假设您有以下表格
T1:
[{a: 1, b: "foo"},
{a: 1, b: "bar"},
{a: 2, b: "baz")]
T2:
[{x: 1, y: "one"},
{x: 1, y: "two",
{x: 2, y: "three"}]
你通过语句将它们连接在一起
SELECT t1.a as a, t1.b as b, t2.y s y
FROM T1 JOIN T2 on t1.a = t2.y
您将获得比开始时更多的行数——
[{a: 1, b: "foo", y: "one"},
{a: 1, b: "foo", y: "two"},
{a: 1, b: "bar", y: "one"},
{a: 1, b: "bar", y: "two"},
{a: 2, b: "baz", y: "three")]
您应该检查以确保您加入的密钥至少在一侧是唯一的。也就是说,您应该确保以下其中一项不返回任何值
SELECT C, count(*) as cnt FROM MU GROUP EACH BY C HAVING cnt > 1
SELECT C, conut(*) as cnt FROM MM GROUP EACH BY C HAVING cnt > 1
另一种方法是在子查询中加入之前在其中一个表上运行 group by。例如
SELECT MU.C
FROM MU
INNER JOIN EACH (SELECT C FROM MM GROUP EACH BY C)
ON MU.C = MM.P_C;