Odps联表查询, 子查询和临时表
在odps愉快地单表查询, 忽然别人告知还需要联表查另一个数据, 此时内心是崩溃的
思路
- 最笨的办法: 直接联表join查询, 原本的字段和筛选条件都加上[a.], 不要提
select *
, 宽表这么干真的会死人. - 其次的办法, 子查询, 这里有两个问题:
- 子查询要一个括号包含, 我们都讨厌括号, 这玩意太容易出问题了
- select部分的[a.], 依旧不可以避免
- 看上去不算好, 但是其实是最优解: 临时表
- 原本的条件临时建一个表
- 然后再联表查, 此时就可以
select *
, 因为, 是自己建的表
代码
# 建立临时表
create table tmpppp2022 as
SELECT
consignee_longitude as 收货人long ,
consignee_latitude as 收货人lat,
shop_longitude as 店铺long
,shop_latitude as 店铺lat
,first_system_judged_deliveryman_arrive_shop_timemillis as 系统判定到店时间
,deliveryman_arrive_shop_timemillis as 骑手到店时间
,deliveryman_receive_meal_timemillis as 骑手取餐时间
,delivered_timemillis as 送达时间
,deliveryman_id -- 联表查询使用的, 唯一修改的地方
FROM xxx_xxx_table WHERE
is_del = FALSE
AND is_test = FALSE
and is_canceled=FALSE
AND shop_is_test = FALSE
and COALESCE(voucher_is_test,FALSE) <> TRUE
and order_status='已完成'
and delivery_type= '骑手派送'
and order_type != '定点订单'
and pay_status= '支付成功'
and shop_is_dada=false and order_source not in ("PF")
and shop_is_virtual_shop != TRUE
and is_all_refund=FALSE
and (commission_rate<50 or commission_rate is NULL )
and order_submit_timemillis> 1659340496000
and shop_city_name='月亮';
# 联表查询, 筛掉数据
create table tmpppp2033 as
select a.* from tmpppp2022 a
join xxx_ooo_table b -- 这里其实是内联, 不满足的都没用
on a.deliveryman_id=b.deliveryman_id -- 联表键值条件
AND COALESCE(b.account_type,'普通账号') <> '运营账号'; -- 筛选条件