在没有重复行的多列上连接两个表

时间:2016-07-21 00:22:53

标签: sql hive

我有两张桌子:

表A:

  • ID

表B:

  • ID1
  • ID2
  • ......(很多其他专栏)

我想得到B中的所有行,其中B.id1或B.id2是A.id(所有A.id都是不同的。这不是B的情况。)

我已经尝试了查询:

User

这很好用,除了它复制id1和id2都在id中的行。 A是一个相对较小的表(大约5000行),而B是相当大的(大约10亿行)。

我想到的解决方案涉及按B列进行分组,以便消除不同的行,将A的ID收集到数组中并在数组中搜索id1和id2,并使用2个单独的查询来搜索id1和id2分别然后联合两个表。这些都显得非常低效,特别是考虑到表格的大小。有没有更好的办法让我失踪?感谢。

1 个答案:

答案 0 :(得分:3)

我会使用exists

select b.*
from b
where exists (select 1 from a where a.id = b.id1) or
      exists (select 1 from a where a.id = b.id2);

在大多数数据库中,这将是此类逻辑的最有效方法。我不是百分之百确定在Hive中这是真的,但绝对值得一试。

另一种方法是left join s:

select b.*
from b left join
     a a1
     on b.id1 = a1.id left join
     a a2
     on b.id2 = a2.id
where a1.id is not null or a2.id is not null;

如果exists没有很好的优化,那么在Hive中可能会有更好的性能。