背景:定时任务删除库中一些没有消耗的广告数据。目前是有两张表:
A表:某个业务的送审记录表(小表);
B表:全量的消耗记录表(大表);
要删除的数据:
- 在A表中且在B表中,但是B表的消耗小于某个值;
或者 - 在A表中且没有在B表中;
如果要满足条件2,单纯的使用mysql语法不太容易实现,我们可以利用左外链接的特性(左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值 )。来找到A表存在但是B表不存在的数据。
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
较为复杂的查询:
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