2016-07-16 82 views
0

我必须从右表左边连接两个表我需要一些列关于三列的连接条件,以及一些列上连接条件的两个相似但一个不同的列(又是3列)和一些列上的连接条件一列(这是以前连接中的一个不匹配的列)。如何减少连接数量?

让我举例说明

表A中的列A1,A2,A3,A4,A5 表B中的列B1,B2,B3,B4,B5,B6,B7现在

我需要

  • A1,
  • A2,
  • A3,A4,
  • B1当A2 = B2,A3 = B3,A4 = B4,
  • B6时,A2 = B5,A3 = B3,A4 = B4,
  • B7当A2 = B2

现在,我怎么能做到这一点不表多次加入,或者更少的时间尽可能。随着CASE当THEN结构或其他任何东西。这些查询适用于Hive,但大多数SQL功能都受支持。 Hive有不同的优化技术,但欢迎sql人员。

在此先感谢您的努力。

+0

样本数据和期望的结果将确实帮助人们了解您想要做什么。 –

回答

0

我很肯定hive支持conditional aggregation。如果我正确理解你的问题,你应该能够使用一个cross join

select a1, a2, a3, a4, 
     max(case when a2 = b2 and a3 = b3 and a4 = b4 then b1 end) b1, 
     max(case when a2 = b5 and a3 = b3 and a4 = b4 then b6 end) b6, 
     max(case when a2 = b2 then b7 end) b7 
from a cross join b 
group by a1, a2, a3, a4 
+0

嗨,感谢您的回放,我需要做一个左连接,它会与交叉连接相同吗?我不明白为什么我需要使用max函数? –

+0

@HimanshuMehra - 你需要在'outer join'中使用哪张表?这应该返回'a'的所有结果和'b'中的匹配值。 'max'用于'条件聚合',基本上是表转换(多个连接的替​​代)。 – sgeddes

+0

@sgedds我很抱歉,我是sql和hive中的新成员,所以我仍然无法理解表的旋转方式和原因。最大函数定义为'返回组中列的最大值'。我猜这意味着如果你通过它多列,它会返回具有较高价值的特定记录。我对吗?感谢您的帮助。 编辑:但最大功能似乎只采取一个值 –

0

你想干什么多个联接:

select a.a1, a.a2, a.a3, a.a4, b1.b1, b2.b6, and b3.b7 
from a join 
    b b1 
    on a.a2 = b1.b2 and a.a3 = b1.b3 and a.a4 = b1.b4 join 
    b b2 
    on a.a2 = b2.b5 and a.a3 = b2.b3 and a.a4 = b2.b4 join 
    b b3 
    on a.a2 = b.b2; 

您可能需要left join如果某些条件不比赛。

+0

但是OP特别说道:'现在我怎么能在不加入表格的情况下实现这一点'。我同意这会工作。 – sgeddes

+0

@sgeddes。 。 。我认为这是OP描述的问题的最佳解决方案,尤其是考虑到他/她正在工作的环境。 –

+0

够公平的,不能认为这可能比“交叉连接”具有更好的性能。也许我不应该从字面上理解这个问题...... – sgeddes