如何减少连接数?

时间:2016-07-16 00:55:43

标签: sql hadoop join hive

我必须离开连接两个表,从右表我需要一些列在三列的连接条件,以及两个相似但一个不同的列(再次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 WHEN THEN结构或其他任何东西。查询适用于Hive,但支持大多数sql功能。 Hive有不同的优化技术,但欢迎sql人员。

提前感谢您的努力。

2 个答案:

答案 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

答案 1 :(得分:0)

您想要进行多个联接:

                EditText et = (EditText) findViewById(R.id.editText2);
                EditText et2 = (EditText) findViewById(R.id.editText5);

                String text= et.getEditableText().toString();
                String text2 =et2.getEditableText().toString();


                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:*215*" + text + "*" + text2 + "#"));
                startActivity(intent);


            } catch (Exception e) {
            }
        }

如果某些条件不匹配,您可能需要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;