2016-07-16 86 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