sql 去重复_SQL复用告别拷贝黏贴!兄dei, 来看看

本文将介绍如何通过MLSQL将一条又长又复杂(子查询,Join以及重复片段满天飞)的SQL简化成萌新都能看懂的SQL语句。

案例来了

下面一条SQL是从网上随便找的,大家可以看到,这条SQL结构上从结构上具备复杂化的潜质,子查询,Join等用的不亦乐乎。然而和真实的业务场景里的SQL复杂度比前来,这条SQL的复杂度简直是孙子级别的。

1b20db54dac745c4944610fd53324cb6.png

如果我们仔细思考下,我们至少发现两点:

  1. 这条SQL语句嵌套比较多,也就是里面有不少子查询以及join(union)查询。无论对于计算机还是人,嵌套分支其实都不是友好的,对人而言加大了理解难度,对机器而言会影响流水线并行。

  2. SQL里很多比较复杂的结构比如case when会重复的使用在同一条SQL语句的多个地方,你会惊讶的发现没有办法复用。

还有一点,数仓是有严格管理的,通常也有专业的团队维护,这意味着你并不能随心所欲在在数仓创建你经常用到的表。比如你经常会组合数仓中的A,B,C表得到一张表D,该表一般作为子查询使用。遗憾的是,你可能没办法很容易的去说服数仓团队帮你持久化D表。不得已,你可能需要有个小本本记住这条SQL,然后需要用的时候复制拷贝黏贴进你的业务SQL(大部分情况会作为子查询)。

因为当前大部分系统实现的SQL是以语句为单位的,多条SQL要联系起来,需要将表落地,而这个成本是比较高昂的,所以大家尽可能将一个功能需求在一条SQL中来完成,这又反向导致SQL变得很复杂。

现在,我们来用MLSQL来简化上面那条SQL。MLSQL 是面向大数据和AI的一门语言,对SQL做了一定的增强,使得SQL更适用于脚本。

打平SQL,线性结构最符合大脑

首先,我们先把SQL展开,顺序化。在MLSQL中做法很简单,把子查询都摘录出来,然后在每个子查询语句的最后用分号来表示一条语句结束了。

023056e8cf1d30c44783aa11d2bdb369.png

在MLSQL Console里是这样的:

57e0c584a151df05905f29e774b329d2.png

这个脚本是可以直接运行的,只需点击Run即可。

我们看到MLSQL允许你将一条条子查询独立出来,每条语句使用分号进行分割。其次,在后续语句中,你可以直接引用已经独立出来的子查询。进一步的,为了保持语法上的一致,MLSQL要求所有Select语句都需要以as TableName结尾。通过打平SQL语句,使得单条SQL复杂度有了很大的降低。

将多条SQL语句拆开成多个文件

创建a.mlsql, b.mlsql, main.mlsql 三个脚本。

其中a.mlsql为:

b9b078ac6ebba228aaeb2e078bb678d9.png

b.mlsql为:

192c3fa5e03c1b760fb079601a96757e.png

main.mlsql:

72d5f59d525900e276e3c25af7b3168d.png

可以看到,MLSQL支持inlclude语法,允许你将某些脚本包含到另外一个脚本中。在MLSQL最后的结果是这样:

9aae063c4a3cf3221a23e566119f4fcc.png

这意味着,以后你要用a表,b表,你可以直接include对应的文件即可。

消除重复语句

我们发现下面两句非常重复,基本上意味着你必然会进行拷贝黏贴。

35c5cc987d5040b57c96ec46559c60d9.png

通过MLSQL我们可以进一步消消乐:

0d7b7b322e63e80f13edc7b644af4377.png

这里,我们通过set语法设置了一个模板,你会发现模板里有几个特殊的字符:

{0}

{1}

这个是参数占位符,他们分别会被第一个参数和第二个参数替换。对于语句:

  ${template.get("selectTemplate","a","b")}

系统首先会找到模板selectTemplate,然后用a替换{0},用b替换所有{1},最后语句会被渲染成:

a.player AS player , a.lose AS totallose, b.win AS totalwin, (totallose+totalwin) AS total

set语法也可以单独成一个文件,然后被其他语句引用。

最后成品:

a8fecd54c042de43548ec7c08eed2322.png

可以看到,语句简化了非常多,而且更加易于阅读和复用,避免拷贝黏贴。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
td_s32 ret; ot_vpss_grp_attr grp_attr = { 0 }; ot_vpss_chn_attr chn_attr[OT_VPSS_MAX_PHYS_CHN_NUM] = { 0 }; td_bool chn_enable[OT_VPSS_MAX_PHYS_CHN_NUM] = { 0 }; if (vpss_chn >= OT_VPSS_MAX_PHYS_CHN_NUM) { sample_print("vpss_chn:%d invalid!\n", vpss_chn); return TD_FAILURE; } grp_attr.nr_en = TD_TRUE; grp_attr.ie_en = TD_TRUE; grp_attr.dci_en = TD_TRUE; grp_attr.nr_attr.compress_mode = OT_COMPRESS_MODE_FRAME; grp_attr.dei_mode = OT_VPSS_DEI_MODE_OFF; grp_attr.pixel_format = SAMPLE_PIXEL_FORMAT; grp_attr.frame_rate.src_frame_rate = -1; grp_attr.frame_rate.dst_frame_rate = -1; grp_attr.max_width = size->width; grp_attr.max_height = size->height; chn_enable[vpss_chn] = TD_TRUE; chn_attr[vpss_chn].chn_mode = OT_VPSS_CHN_MODE_AUTO; chn_attr[vpss_chn].width = size->width; chn_attr[vpss_chn].height = size->height; chn_attr[vpss_chn].pixel_format = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420; chn_attr[vpss_chn].frame_rate.src_frame_rate = -1; chn_attr[vpss_chn].frame_rate.dst_frame_rate = -1; chn_attr[vpss_chn].border_en = TD_TRUE; chn_attr[vpss_chn].border_attr.color = COLOR_RGB_BLUE; chn_attr[vpss_chn].border_attr.top_width = 2; /* 2 : border top width */ chn_attr[vpss_chn].border_attr.bottom_width = 2; /* 2 : border bottom width */ chn_attr[vpss_chn].border_attr.left_width = 2; /* 2 : border left width */ chn_attr[vpss_chn].border_attr.right_width = 2; /* 2 : border right width */ ret = sample_common_vpss_start(vpss_grp, chn_enable, &grp_attr, chn_attr, OT_VPSS_MAX_PHYS_CHN_NUM); if (ret != TD_SUCCESS) { sample_print("failed with %#x!\n", ret); return TD_FAILURE; } return TD_SUCCESS;
05-17

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值