1. union語(yǔ)法
select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement ...
UNION將多個(gè)SELECT語(yǔ)句的結(jié)果集合并為一個(gè)獨(dú)立的結(jié)果集干花。當(dāng)前只能支持UNION ALL(bag union)。不消除重復(fù)行。每個(gè)select語(yǔ)句返回的列的數(shù)量和名字必須一樣,否則,一個(gè)語(yǔ)法錯(cuò)誤會(huì)被拋出膳殷。
從語(yǔ)法中可以看出UNION有兩個(gè)可選的關(guān)鍵字:
使用DISTINCT關(guān)鍵字與使用UNION 默認(rèn)值效果一樣,都會(huì)刪除重復(fù)行使用ALL關(guān)鍵字九火,不會(huì)刪除重復(fù)行赚窃,結(jié)果集包括所有SELECT語(yǔ)句的匹配行(包括重復(fù)行)
注意
Hive 1.2.0之前的版本僅支持UNION ALL册招,其中重復(fù)的行不會(huì)被刪除。Hive 1.2.0和更高版本中勒极,UNION的默認(rèn)行為是從結(jié)果中刪除重復(fù)的行是掰。
DISTINCT union可以顯式使用UNION DISTINCT,也可以通過(guò)使用UNION而不使用以下DISTINCT或ALL關(guān)鍵字來(lái)隱式生成辱匿。
每個(gè)select_statement返回的列的數(shù)量和名稱必須相同键痛。 否則,將拋出錯(cuò)誤匾七。
注意
在Hive 0.12.0和更低版本中絮短,UNION只能在子查詢中使用,例如“SELECT * FROM(select_statement UNION ALL select_statement)unionResult”昨忆。從Hive 0.13.0開始戚丸,UNION也可以在頂級(jí)查詢中使用:例如“select_statement UNION ALL select_statement UNION ALL ...”。 (見HIVE-6189扔嵌。)在Hive 1.2.0之前,僅支持UNION ALL夺颤。 Hive 1.2.0以后版本可以支持支持UNION(或UNION DISTINCT)痢缎。
2. UNION在FROM子句內(nèi)
如果還需要對(duì)UNION的結(jié)果集進(jìn)行一些其他的處理,整個(gè)語(yǔ)句表達(dá)式可以嵌入到FROM子句中世澜,如下所示:
SELECT * FROM
( select_statement UNION ALL select_statement)
例如独旷,假設(shè)我們有兩個(gè)不同的表分別表示哪個(gè)用戶發(fā)布了一個(gè)視頻,以及哪個(gè)用戶發(fā)布了一個(gè)評(píng)論寥裂,那么下面的查詢將UNION ALL的結(jié)果與用戶表join在一起嵌洼,為所有視頻發(fā)布和評(píng)論發(fā)布創(chuàng)建一個(gè)注釋流:
SELECT u.id, actions.date
FROM ( SELECT av.uid AS uid FROM action_video av WHERE av.date = '2008-06-03'
UNION ALL
SELECT ac.uid AS uid FROM action_comment ac WHERE ac.date = '2008-06-03' )
actions JOIN users u ON (u.id = actions.uid)