2014-01-29 52 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