0

我们有两个包含大量数据的表。我们必须在这两个表之间执行内部连接。加入条件基于 3 列 c1、c2、c3。

在为上述场景编写优化查询时需要您的帮助。请参考下面的数据模型。

table1

c1,c2,c3,c4,c5


table2

c1,c2,c3

感谢你的帮助。谢谢。

4

3 回答 3

2

如果我对Hortonworks 的创始人 Owen O'Malley 的理解正确,你可以写优化它

SELECT t1.* from table1 t1
JOIN (SELECT table2.* FROM table2) t2
ON (t1.c1=t2.c1 AND t1.c1 = t2.c2 AND t1.c3 = t2.c3)
于 2013-07-23T20:26:47.597 回答
1

因为您似乎没有使用 table2 中的任何新数据,逻辑是“返回 table1 中存在于 table2 中的所有行”。这是通过使用left semi join.
如果 table2 不是 uniqe 则记录数可能会增加(c1 c2 c3 的相同组合出现多次)。

于 2013-07-24T18:22:57.787 回答
0

内连接将为您提供表 1 和表 2 中存在的所有行以及与表 2 中存在的其他列存在的任何额外组合。像@dimamah 提到的左半连接将只为您提供那些行存在于左表 1 中。

对于您应该期望更多行的第一个解决方案

SELECT t1.* 
FROM table1 t1
INNER JOIN table2 t2
ON (t1.c1=t2.c1 AND t1.c1 = t2.c2 AND t1.c3 = t2.c3)

对于第二种解决方案,您将获得与 t1 相同的行数

SELECT t1.*
FROM table1 t1
LEFT SEMI JOIN table2 t2
ON (t1.c1=t2.c1 AND t1.c1 = t2.c2 AND t1.c3 = t2.c3)
于 2016-02-18T11:49:37.720 回答