如何根据联接列的条件联接配置单元表

时间:2019-05-15 20:10:09

标签: hadoop hive hiveql

我们有一个如下所示的配置单元表:

num    value 

123     A 
456     B 
789     C 
101     D

联接表为:

num       Symbols

123         ASC
456001      JEN
456002      JEN
456003      JEN
789001      CON
101         URB

我们的预期结果:

num   value   symbols
123    A       ASC
456    B       JEN
789    C       CON
101    D       URB

当前,我们将表连接两次以获取结果。 像第一次使用以下查询插入一些tmp表:

select
a.num,
a.value,
b.symbols
from mytable a
join mytable b on a.num = b.num;

此查询产生的结果为keys 123,101.

接下来,我们正在运行另一个查询,如下所示:

select
    a.num,
    a.value,
    b.symbols
    from mytable a
    join mytable b on CONCAT(a.num,'001') = b.num;

此查询产生keys 456, 789的结果。

将这两个查询结果插入到一些tmp配置单元表中,然后从tmp表中选择最终结果。

总体上看这是一个糟糕的设计。但我想知道是否有更好的方法可以实现这一目标。谢谢。

查询结果

对于

Select 
    a.num
    ,a.value
    ,b.symbols 
    from 
    (select substr(num,3) as num, value from table)a
    join 
    (select substr(num,3) as num, symbols from table) b
    on a.num = b.num

a.num   a.value b.symbols
3        A      ASC
1        D      URB

4 个答案:

答案 0 :(得分:1)

好吧,只有一个SQL可以实现您的要求。请参见下文,表a是带有值列的表,表b是带有符号列的表,SQL:

select
    distinct a.num,
    a.value,
    b.symbols
from
    mytable1 a
join
    mytable2 b on substr(cast(b.num as string),0,3) = cast(a.num as string)

答案 1 :(得分:0)

如果num的数据类型为String,则可以尝试使用Substr

Select 
a.num
,a.value
,b.symbols 
from a join b on 
substr(a.num,3) = substr(b.num,3)

答案 2 :(得分:0)

您可以尝试一下

Select 
    a.num
    ,a.value
    ,b.symbols 
    from 
    (select substr(num,3) as num, value from table)a
    join 
    (select substr(num,3) as num, symbols from table) b
    on a.num = b.num

答案 3 :(得分:0)

是否可以尝试使用左半联接与上述查询,如下所示。
    选择     a.num,     一个值,     b。符号 从     mytable1 a     左半连接     在substr上的mytable2 b(cast(b.num作为字符串),0,3)= cast(a.num作为字符串)