在odps愉快地单表查询, 忽然别人告知还需要联表查另一个数据, 此时内心是崩溃的

思路

  1. 最笨的办法: 直接联表join查询, 原本的字段和筛选条件都加上[a.], 不要提select *, 宽表这么干真的会死人.
  2. 其次的办法, 子查询, 这里有两个问题:
    • 子查询要一个括号包含, 我们都讨厌括号, 这玩意太容易出问题了
    • select部分的[a.], 依旧不可以避免
  3. 看上去不算好, 但是其实是最优解: 临时表
    • 原本的条件临时建一个表
    • 然后再联表查, 此时就可以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,'普通账号') <> '运营账号'; -- 筛选条件