防御性SQL

SQL中增加防御性

接到产品一个的临时跑数需求,如下:

近30天的uv

  1. a表中条件c1
  2. b表中条件c2
  3. 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

结果分析

  1. 如果发现有个别flag的值特别小,则可以看出来对应的查询条件一般是有问题的,需要再核查一下。
  2. 如果发现3种flag的数据差异不大,则可以确认对应的每种查询条件没有问题,数据是可以交付的。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容