逻辑大量的写在 sql 语句里

2022-02-21 16:40:54 +08:00
 moxiaowei

今天看了下同事写的代码,才发现他居然喜欢把大量的逻辑写在 sql 语句里,跟他讲了下,他说是以前同事教的,我认为这样写可读性实在太差了,但是他也不愿意听我的!想听听各位大佬怎么讲。 下面是一段 sql

      SELECT
        m.id,
        m.menuname,
        m.link,
        m.parent_id,
        m.menutype,
        m.sort
--         CASE
--         WHEN pm.parent_id > 0 THEN
--         1 ELSE 0
--         END hasChildren
        FROM
        menu m
--         LEFT JOIN ( SELECT DISTINCT parent_id FROM menu ) pm ON pm.parent_id = m.id
        WHERE
        m.is_deleted = 0
        <if test="userId !=null and userId !=''">
            and m.id in (SELECT DISTINCT
            rm.menu_id
            FROM
            role2menu rm
            LEFT JOIN role r ON r.id = rm.role_id
            LEFT JOIN user2role ur ON ur.role_id = r.id
            WHERE
            rm.is_deleted = 0
            AND ur.user_id = #{userId} )
        </if>
        ORDER BY
        m.sort

这只牵扯到 3 张表,就这么多 left join ,我后面又去翻了翻 10 来次 left join 的也很多。
16294 次点击
所在节点    Java
244 条回复
jeffxjh
2022-02-21 17:21:54 +08:00
想看不用连接查询的做法 大神给翻译翻译
ainyyy
2022-02-21 17:22:11 +08:00
我不觉得这个 sql 有什么问题。。 分开查询数据库更蠢吧。
kingwrcy
2022-02-21 17:29:16 +08:00
sql 没问题,你是不是对复杂有什么误解?

这个一次性能返回结果不是挺好?

你如果业务代码写也不见得别人能懂啥意思,sql 挺能表达你的业务的
leafre
2022-02-21 17:29:47 +08:00
“这只牵扯到 3 张表,就这么多 left join ,我后面又去翻了翻 10 来次 left join 的也很多。”

join 最多 3 张表,再多不合理
james2013
2022-02-21 17:31:12 +08:00
这个不算大量吧
当我看到有的统计 sql
各种 if 判断和 join,lefj join, 1 条 sql 语句竟然有 300 行+,看的都吐了
adoal
2022-02-21 17:31:23 +08:00
@moxiaowei 10 来个 join 就搞死?如果不是 MySQL 的话没那么怕多 join 的。
retrocode
2022-02-21 17:40:10 +08:00
这都是小 case,再烂的我都见过,有的厮直接 sql 里拼结构一个 sql 一两百行很正常.

你贴的这种写法有历史渊源的,有时候产品让加筛选,还特别急, 懒一点的人就是直接 sql 里改,然后丢 xml 上去更新

比如楼上说的 “这个功能明天就要”

早上提需求,中午问进度,第二天早上就要上线, 求稳定肯定是用改动最小的方法来的

不过恶心是真的恶心, 建议跑路, 我盲猜是政府项目
Paracosm
2022-02-21 17:42:39 +08:00
= = 。。。我经常写几百行的 sql ,不过我不是写后端的就是了
constantine008
2022-02-21 17:43:58 +08:00
我来支持下楼主,建议压测看看会不会有慢查询,像这种语句我估计大概率是慢查询,高并发情况下 CPU 很容易就打满
jsjjdzg
2022-02-21 17:44:31 +08:00
唉,写的搜索 Logstash 通道容器,全是复杂 SQL ,要一个 SQL 搜集各种上游数据,一点办法都没。。。
aliveyang
2022-02-21 17:44:36 +08:00
这个不算复杂吧,你是没看过银行存储过程的,那才是脑壳痛
muyiluop
2022-02-21 17:46:54 +08:00
借楼问一下,如果不用连表,但是查询字段又存在其他表中的情况,一般怎么做?
比如:a 、b 两个表,b 中存了 a 的 id ,查询 b 表时有个条件是 a 中的 name 字段
不连表我能想到的方法是:根据 name 条件查询出 a 的 id ,然后通过 b.aid in 的方式来查询
wudaye
2022-02-21 17:51:25 +08:00
SQL 层次不超过 2 层能接受,3 层就比较难受,适当的连表或子查询是合理的,但是你贴的这个 SQL 就有点过了,个人认为可维护性比性能重要得多
moxiaowei
2022-02-21 17:51:34 +08:00
上面有好几个喷子,麻烦看看标题好么?麻烦,那些觉得写 left join10 来次的是正常代码的,去问问你公司的 leader ,他允不允许,站在自己的角度上来想这个问题,简直是没脑子!你这样写纯属前人挖坑葬后人,坑了一波又一波!你也在这公司干不过 3 年!
moxiaowei
2022-02-21 17:52:49 +08:00
@wudaye 终于看到了一个评论能看的,上面那些喷子只是为了完成任务,根本不为了长远发展,写写一大堆的业务逻辑到 sql 里面,后面人要看到吐血的!
moxiaowei
2022-02-21 17:53:45 +08:00
@adoal 你牛逼 对你我是真的很佩服的
acdfjelxe
2022-02-21 17:53:54 +08:00
各种场景几百行 SQL 都挺常见的,但你 SQL 得让数据库有优化空间 🌝
moxiaowei
2022-02-21 17:55:02 +08:00
@yor1g 我说不能了?主观臆想啥呢?自嗨?
moxiaowei
2022-02-21 17:56:20 +08:00
@kingwrcy 贴你写的 sql 出来 问问下个接受的想不想打你
fisherwei
2022-02-21 17:57:53 +08:00
我这有个保存下来有 4MB 的 sql ,谁爱改谁改去,反正现在能用

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

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

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

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

© 2021 V2EX