寫(xiě)presto的時(shí)候在left join上踩過(guò)坑宪潮,總結(jié)記錄一下拌禾。
內(nèi)容參考知乎文章https://zhuanlan.zhihu.com/p/85856388
我們知道left join的作用是在連接的時(shí)候保留左表的記錄缔刹,右表如果沒(méi)有對(duì)應(yīng)的行就置空技竟。但如果遇到以下兩種情況就需要注意了:
1. 左表和右表是一對(duì)多或多對(duì)多的關(guān)系時(shí)
一對(duì)多時(shí)缩幸,注意結(jié)果不是只保留一行千贯!右表有多少行對(duì)應(yīng)的結(jié)果就有多少行髓堪!
例如下面兩個(gè)表送朱,t_age表中dt=20190905的行匹配到了t_name中3行,dt=20190905的最終結(jié)果就有3行
多對(duì)多時(shí)就像做笛卡爾積(其實(shí)一對(duì)多也是笛卡爾積)干旁,比如上面那個(gè)例子中左表t_age表中有2行dt=20190906驶沼,右表t_name有兩行dt=20190906,最終結(jié)果就有 2 x 2 = 4行
2. 需要對(duì)左表或右表進(jìn)行過(guò)濾時(shí)
直接上結(jié)論争群,對(duì)左表過(guò)濾時(shí)用where回怜,對(duì)右表過(guò)濾時(shí)用on。
如果用where對(duì)右表過(guò)濾换薄,會(huì)導(dǎo)致右表匹配為空的行整行被過(guò)濾掉玉雾,這時(shí)left join的結(jié)果就和join一樣了翔试;如果用on對(duì)左表過(guò)濾,左表每一行數(shù)據(jù)依然會(huì)留著复旬,這個(gè)on限制有和沒(méi)有一樣垦缅。