hivesql中 exists 用法

有一次面试的时候,面试官问了这么一个场景题:一家门店一个月内每位顾客访问的目的可能有多种,并给到访顾客的目的打标签1、2、3、4这四类,现在要统计这家门店一个月内没有3、4标签的顾客明细。(也就是顾客到访标签只有1或者2,但凡被打过3或4标签的客户都要被排除掉)

很明显,这个场景用exists就很合适了。

先建一张表,插入几条数据,简单模拟一下这个场景

hivesql中 exists 用法_第1张图片

 如上图,到访门店的一共四位顾客,不存在标签3、4的实际上只有顾客李四和赵六

SELECT * FROM DPM.y_cus_visit 
WHERE 
cus_code NOT IN (SELECT cus_code FROM DPM.y_cus_visit WHERE visit_goal IN (3,4))

 这种写法是先把存在标签3、4的顾客找出来,然后在where条件做筛选排除掉。

运行结果如下:

hivesql中 exists 用法_第2张图片




 那么用exsits 运行呢,出来的结果跟第一种写法是一样的

SELECT * FROM y_cus_visit a 
WHERE NOT EXISTS (SELECT 1 FROM DPM.y_cus_visit b WHERE a.cus_code=b.cus_code 
AND b.visit_goal IN (3,4));

hivesql中 exists 用法_第3张图片

not exists语句的执行顺序如下

1.首先会执行外循环(SELECT * FROM y_cus_visit)

2.外循环返回的结果每一行都会拿着去内层循环执行

ps:SELECT * FROM y_cus_visit 查询的为 (001,001,001,002,002,003,003,004,004);此时内循环执行顺序应该是 001 003

外循环 not exsits 内循环

那么出来只剩下002和004的数据了

你可能感兴趣的:(Hive数据仓库构建,大数据,hivesql,hive,sql)