2016-07-16 8 views
0

私は2つのテーブルを結合する必要があります。右のテーブルからいくつかのカラムが必要です。3つのカラムのジョイン条件で、2つの類似しているが1つの異なるカラム(やはり3つのカラム) 1つの列(以前の結合では一致しない列の1つです)。結合数を減らすにはどうすればいいですか?

私が例で説明しましょう

表A列のA1、A4、A3、A2を、持っている 表Bは、

今列B1、B2、B3、B4、B5、B6、B7を持っているA5 I

  • A1、
  • A2、
  • A3、A4、
  • B1 A2 = B2、A3 = B3、A4 =を必要としますB4、
  • B6 A2 = B5、A3 = B3、A4 = B4、
  • B7ときA2 =今どのように私はテーブルを結合することなく、複数回これを達成することができ、以下の倍B2

できるだけ。構造体または何か他のものがある場合。クエリはHive用ですが、ほとんどのSQL機能がサポートされています。 Hiveにはさまざまな最適化手法がありますが、SQLの人は大歓迎です。

ご協力いただきありがとうございます。

+0

サンプルデータと望ましい結果は、人々があなたがしたいことを理解するのに役立ちます。 –

答えて

0

私はかなり確信しています。hiveconditional 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

こんにちは、再生していただきありがとうございます、私は左の結合を行う必要があります、それはここで十字結合と同じでしょうか?私はなぜ最大限の機能を使用する必要があるのか​​分からないのですか? –

+0

@HimanshuMehra - どのテーブルを外部結合で使用する必要がありますか?これは、 'a'のすべての結果を' b'の値と一致させて返します。 'max'は基本的にテーブルのピボッティング(複数の結合の代替)である'条件付き集約 'で使われます。 – sgeddes

+0

@sgedds申し訳ありませんが、SQLとハイブで新しくなっているので、テーブルがピボットされている方法とその理由を理解できていません。 max関数の定義は 'グループの列の最大値を返します。'私はあなたがそれを複数の列を渡す場合、特定のレコードのためのより高い価値を持っているものを返すと思います。私はそれを正しくしていますか?助けてくれてありがとう。 編集:しかし、最大関数は1つの値を取るようだ。 –

0

が参加する:いくつかの条件がない場合は、left joinが必要な場合があります

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; 

一致。

+0

しかし、OPは具体的に言う:「今、テーブルに何度も参加せずにこれを達成するにはどうすればいいですか?私はこれがうまくいくことに同意する。 – sgeddes

+0

@sgeddes。 。 。私はこれが、OPが説明している問題に対する最良の解決策であると考えています。特に環境が働いていることを考えてください。 –

+0

十分に公正で、これが「クロスジョイント」よりも優れたパフォーマンスを持つことはできません。多分私はその質問を文字通り読むべきではないでしょう... – sgeddes

関連する問題