Mysql语法(7)— 左外连接妙用(找到A表存在,B表不存在的数据)

背景:定时任务删除库中一些没有消耗的广告数据。目前是有两张表:
A表:某个业务的送审记录表(小表);
B表:全量的消耗记录表(大表);

要删除的数据:

  1. 在A表中且在B表中,但是B表的消耗小于某个值;
    或者
  2. 在A表中且没有在B表中;

如果要满足条件2,单纯的使用mysql语法不太容易实现,我们可以利用左外链接的特性(左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值 )。来找到A表存在但是B表不存在的数据。

image.png
select 
  A.x_id
from 
  A 
LEFT JOIN B ON A.x_id=B.x_id
where B.cost <= 0 or B.x_id is null

较为复杂的查询:

image.png
select 
   A1.x_id
   from
   (select x_id from A where dt=xx group by x_id) A1
LEFT JOIN (select x_id from B where p_date in (xx,yy) group by x_id having sum(cost)>0)  B1
ON A1.x_id=B1.x_id
where B1.x_id is null

推荐阅读更多精彩内容