求助,如何写这种业务 sql 比较好

2019-11-16 22:03:54 +08:00
 miv

做公司项目遇到一个问题。 是这样的,需要统计一些数据 a 表有字段:机构编码,渠道编码,业务值等 机构表 b 有字段:机构编码,机构名称,父级机构编码等 a 表的数据比如:100789、1、100 然后 b 表数据: 1007、广州、100, 10078、天河某区、100 等数据 因为要统计 a 表数据,并且要显示机构名称。所以 a 表 b 表需要关联 此时使用 like 进行关联匹配(机构编码无法直接等于去关联) 使用 sql 如 a.机构编码 like b.机构编码% 可是这样 a 一条数据对于了 2 个机构,数据重复了 怎么破?

3010 次点击
所在节点    程序员
24 条回复
065535
2019-11-18 11:26:31 +08:00
上面的方法可以解决数据查询问题,但未来可能会遇到性能瓶颈。终极建议:业务上增加一个冗余列做关联,不要用 like 了。
miv
2019-11-18 12:05:15 +08:00
@065535 有道理,星期天加班按那种方法搞,可以没错,性能上是一个问题,而且特别是统计业务这块,写出来 sql 我自己都绕晕了,而且很复杂。
早知道还是用实体类分步骤去弄了。
数据结构这方面没权力改,老哥建议很好。
lumious
2019-11-18 13:35:31 +08:00
使用 b 表作为主表,对 a 表的机构编码进行截取汇总关联到主表中
从楼主给的数据看,市一级(广州市)的编码是 4 位,区一级(白云区)的编码是 5 位
要统计到区一级,sql 类似于这样:
select b.地区编码,statistic.* from b,(select substr(机构编码,0,5) 地区编码,sum(业务值) group by substr(机构编码,0,5)) statistic where b.地区编码=statictic.地区编码(+) and b.地区编码 like '_____'
这个是 oracle 的写法,mysql 改成 left join 就行
miv
2019-11-18 21:41:12 +08:00
@lumious 机构有可能是更低一级,截取不太可行.所以,今天,现在还是不考虑复杂 sql 了,今天用实体类,查询出全部数据,在一步步处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/620280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX