2014-01-29 17 views
3

如果我有一个表mytable和列表如何与列表交叉连接表格?

set vals = (1,2,3,4); 

,我想交叉联接与名单表(获得其中有4个时间尽可能多的行与原始表和一个额外val新表列),我有比创建an explicit temp table更好的选择吗?

什么我可以做的是:

select a.*, b.val 
from mytable a cross join 
(select stack(4,1,2,3,4) as (val) from 
(select * from mytable limit 1) z) b; 

编辑:我主要用例是通过-hiveconf vals='4,1,2,3,4'hive,并在上面的代码与stack(${hiveconf:vals})更换stack(4,1,2,3,4)

+0

你不能使用联盟? like(select 1 as stg union select 2 union select 3 union selec 4)? – PeterRing

+0

@PeterRing:我认为'union'会比我现在更糟糕,但请使用它发布一个答案! – sds

回答

1
select a.*, b.val 
from a lateral view explode(array(1,2,3,4)) b as val; 
2

我不知道这会有所帮助。

SELECT * 
from mytable cross join 
(select 1 as p 
union 
select 2 
union 
select 3 
union 
select 4) as x 
+0

+1,但如果我有20个而不是4个值呢?我认为你的代码大小爆炸。 – sds

+0

游标+动态SQL – PeterRing