Hive 一种奇怪的SQl写法

问题描述

想要从用户表 temp_user_list 取一些数据,具体取数逻辑如下:

prov_id ='011' 并且 product_id = '1195362,或者 prov_id ='010' 并且 product_id = '1089562, 这个题目是不是很简单,但是仔细想来实现起来有很多方式,接下来看看我第一时间想出来的三种实现方式的差异

方式1

select t.user_id, t.prov_id, t.product_id
from temp_user_list t
where ((prov_id = '011' and product_id = '1195362') or (prov_id = '010' and product_id = '1089562'));

限制条件中间使用 or 进行连接,取数条件多的时候再加几个 or 表达式就好了

方式2

select t.user_id, t.prov_id, t.product_id
from temp_user_list t
where (t.prov_id, t.product_id) in (('011', '1195362'), ('010', '1089562'));

这种方式看起来相对简介一点,条件多的时候直接在后面加括号进行新增限制逻辑即可。

方式3

select t.user_id, t.prov_id, t.product_id
from temp_user_list t
         left semi
         join (select '011' prov_id, '1195362' product_id union all select '010', '1089562') t1
              on t.prov_id = t1.prov_id and t.product_id = t1.product_id;

使用 union all 构建子查询,使用主表进行 left semi join ,这种方式看起来有点复杂,不过执行效率是不是比前两个高呢,有时间测试一下。

posted @   晓枫的春天  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
历史上的今天:
2022-02-09 centos 7 提示 xxx command not found
2022-02-09 hive求不及格课程数大于等于2的学生的平均成绩及其排名
点击右上角即可分享
微信分享提示