SQL中增加防御性
接到产品一个的临时跑数需求,如下:
近30天的uv
- a表中条件c1
- b表中条件c2
- c表中条件c3
以上业务虽然很简单,但是对于上述的3个表我个人其实不是很熟悉,我先确认了下上述3个表在各自的条件下是否是有数的,因为一旦有个别表在它的条件下没数据,其实我们是很难发现的。在我确认完3个条件没问题之后才开始写SQL,发现完全可以在SQL中对上述的问题进行规避,即我们不光算整体的uv,我们也顺便算一下3个表各自条件下的uv不就一并解决了吗?一唯的成本就是跑数据稍微花点时间。
我们得到了最终的防御性SQL如下:
select flag, count(distinct id) uv
from (
select id
from a
where c1 and date >= ${date - 30} and date <= ${date - 1}
union all
select id
from b
where c2 and date >= ${date - 30} and date <= ${date - 1}
union all
select id
from c
where c3 and date >= ${date - 30} and date <= ${date - 1}
union all
) as a
group by flag
with rollup
结果分析
- 如果发现有个别
flag
的值特别小,则可以看出来对应的查询条件一般是有问题的,需要再核查一下。 - 如果发现3种
flag
的数据差异不大,则可以确认对应的每种查询条件没有问题,数据是可以交付的。