我們通常的認知是聯表查詢時ON是作用于聯表前(時)的過濾條件,WHERE是對聯表后的資料的過濾條件,但hive sql查詢有個特殊點需要關注,那就是對于left join中的單獨針對左表的ON過濾條件有可能會被忽略,比如
SELECT DISTINCT a.dt FROM
wlxdw.dws_tuid_cheat_di a
LEFT JOIN
wlxdw.apps_tuid_device_map_ds b
ON a.tuid = b.tuid AND a.dt='2021-10-18' AND b.dt='2021-10-19'
查詢結果

可以看到a.dt='2021-10-18’這個過濾條件并沒有生效,有人可能覺得b.dt='2021-10-19’是不是也沒有生效,把上述SQL稍作修改來驗證一下
SELECT DISTINCT b.dt FROM
wlxdw.dws_tuid_cheat_di a
LEFT JOIN
wlxdw.apps_tuid_device_map_ds b
ON a.tuid = b.tuid AND a.dt='2021-10-18' AND b.dt='2021-10-19'


顯而易見,右表上的ON條件 b.dt=xxxx 生效了,那如果想要左表的 a.dt=‘2021-10-18’ 生效,可以放在WHERE條件上

而如果把右表的b.dt=‘2021-10-19’ 放到WHERE條件,語意則變的不一樣,由于WHERE是先聯表再進行過濾,這時查詢結果中b.dt就不存在值為NULL的情況了,LEFT JOIN 相當于變成了 INNER JOIN



從上面的結果可以看出ON和WHERE查詢條件語意上的差別
再來看一組SQL對比



神奇的一幕出現了,此時ON中的過濾條件a.dt=‘2021-10-18’ 時而生效時而不生效
總結:Hive SQL 中 LEFT JOIN 單獨針對左表的過濾條件必須放在WHERE上,放在ON上的效果是不可預期的,單獨針對右表的查詢條件放在ON上是先過濾右表,再和左表聯表,放在WHERE條件上則是先聯表再過濾,語意上存在差別,
補充:對于MYSQL中的LEFT JOIN和Hive中表現相似,更深層次分析可以看看 https://developer.aliyun.com/article/718897
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330240.html
標籤:其他
上一篇:資料庫是否應該使用外鍵約束?
