最近在寫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.那麼...