hive left join 丟失資料

2021-10-24 02:07:50 字數 1014 閱讀 6022

最近在寫hql取資料的時候,發現不同的寫法會模糊left join 和 join,使得得出的結果不是預期的。

分別列出三段hql供參考:

select a.cola1,a.cola2,b.colb1

from tablea a

left join tableb b on a.id=b.id

where

a.dt='20200826'

and b.dt='20200826'

;

結果:這樣的寫法會使得  left join 失效,得到的結果是兩張表 join 的結果。主表的資料會丟失。

2、下面是第二段hql,where後邊只有主表的條件,其他表的條件寫在了 on 的後邊:

select a.cola1,a.cola2,b.colb1

from tablea a

left join tableb b on a.id=b.id and b.dt='20200826'

where

and a.dt='20200826'

;

結果:這樣的寫法可以正確使用left join ,得到預期的結果。主表的資料不會丟失。

3、下面是第三段hql,使用select語句以及where得到兩張需要的表,再進行left join:

select * from 

(select cola1,cola2 from tablea where dt='20200826')a

left join

(select colb1 from tableb where dt='20200826')b

on a.id=b.id

;

結果:這樣的寫法可以正確使用 left join,得到預期的結果。主表的資料不會丟失。

結論:第一種寫法看著是left join,實際執行的是join,得到的可能不是預期的結果,需要謹慎使用。第二種和第三種寫法得到的都是預期的結果。

原創 Hive left join 技巧總結

根據工作中經驗總結出來 left join 常用的 使用注意點 a left join b on a.id b.id 第一種情況 如果 a 表 的 id 存在 重複,b 表的 id 不存在 重複,那麼 select from a left join b on a.id b.id,sql 執行的結果 ...

尋找丟失的數 II LintCode

給乙個由 1 n 的整數隨機組成的乙個字串序列,其中丟失了乙個整數,請找到它。注意事項 n 30 樣例 給出 n 20,str 19201234567891011121314151618 丟失的數是 17 返回這個數。思路 回溯法,進行判斷時,構建visited,來存放數字是否出現過,若當前的位置小...

求1 100丟失的數

假定乙個陣列的容量arr是99,裡面含有1 100這100個數里的99個,不重複,如何快速地定位到缺失的那個數。演算法的複雜度是?如果陣列是有序的,也就是,1,2,3。那麼任何相鄰的兩個數 兩數都是連續的 之間的差值的絕對值是1,如果存在不連續的情況,也就是差值的絕對值是不等於1,實際上等於2.那麼...