【问题标题】:Join two tables on multiple columns without duplicate rows连接多个列上的两个表而没有重复的行
【发布时间】:2016-11-24 09:01:51
【问题描述】:

我有两张桌子:

表 A:

  • 身份证

表 B:

  • id1
  • id2
  • ...(许多其他列)

我想获取 B 中 B.id1 或 B.id2 为 A.id 的所有行(所有 A.id 都是不同的。B 不是这种情况)。

我已经尝试过查询:

create table C as
select B.*
from B 
join A on (A.id = B.id1 or A.id = B.id2);

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

我想到的解决方案涉及按 B 的列分组,以便消除不同的行,将 A 的 id 收集到一个数组中并在数组中搜索 id1 和 id2,并使用 2 个单独的查询来搜索 id1和 id2 分别然后合并两个表。这些似乎都非常低效,尤其是考虑到表格的大小。有没有更好的方法可以做到这一点,我错过了?谢谢。

【问题讨论】:

  • 使用select distinct有什么问题?
  • 考虑到我的数据量太慢了。

标签: sql hive


【解决方案1】:

我会使用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);

在大多数数据库中,这将是此类逻辑最有效的方法。我不能 100% 确定这在 Hive 中是否正确,但绝对值得一试。

另一种方法是left joins:

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 中可能会有更好的性能。

【讨论】:

  • 谢谢!我不认为第一个会起作用,因为 hive 不支持相关子查询,但替代方案看起来很完美。我什至没有考虑使用左连接,但它很有意义。
  • @TheSlimyDog 。 . . Hive 确实支持与 EXISTS (cwiki.apache.org/confluence/display/Hive/…) 相关的子查询,尽管旧版本可能不支持。
  • 我试过了,第一个版本不行。我收到错误:FAILED: SemanticException [Error 10249]: Line 4:6 Unsupported SubQuery Expression 'id2': Only 1 SubQuery expression is supported。如果我只有一个表达式但两个都没有,这似乎有效。
猜你喜欢
  • 1970-01-01
  • 2020-03-28
  • 2011-11-25
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多