2

我正在尝试在 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 亿条记录的结果。

我究竟做错了什么?

4

1 回答 1

4

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;
于 2013-09-13T23:13:33.157 回答