逻辑大量的写在 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 的也很多。
18718 次点击
所在节点    Java
244 条回复
SuperXRay
2022-02-22 10:25:52 +08:00
@daimubai 说菜狗可能真这么觉得,#58 楼认为属于客观称述
和带脏字谩骂性质还是有所不同的
Henry399
2022-02-22 10:28:05 +08:00
某公司的作风
Telegram
2022-02-22 10:30:59 +08:00
我感觉问题不大啊,也就是可读性差点。
sql 这东西本来就相对来说比较不容易理解的,特别是联查,各种左右连接之类的。
搞过存储过程的,这个应该还算一般复杂啊。

以前看过管家婆的数据库,里面全是存储过程,可比这个复杂多了
hernuo
2022-02-22 10:47:03 +08:00
这个没看出有什么问题,难道不让用 join 吗。不这样写,那只能在代码里查单表取 id ,再根据 id 去查另一张表,或许还要再查其他表,最后拼起来不是更麻烦吗。
nba2k9
2022-02-22 10:51:25 +08:00
十几行的 sql 算什么可读性啊
维护过上百行的 sql 表示无所畏惧
mencounter
2022-02-22 10:52:46 +08:00
你们有见过银行的面向 SQL 编程?
statement
2022-02-22 10:54:20 +08:00
大概是用 MySQL 惯的 Oracle 即使出现比这复杂十倍的也太正常了
seakingii
2022-02-22 10:55:45 +08:00
楼主列的 SQL 并不复杂,这种程序的 SQL 应该是允许的
业务要不要写在 SQL 里要看具体的场景,脱离场景讨论就是耍流氓

互联网业务尽量少写复杂 SQL
中小型的 ERP 之类的无所谓,因为那些业务逻辑复杂的一批,用其它编程语言拉数据再处理会搞死人,特别是各种复杂的业务报表
不要以为自己是搞互联网的就一杆子打死所有人
ZeroDu
2022-02-22 11:01:28 +08:00
首页楼主列的这个 sql 其实还好,没啥问题。毕竟 menu 、role 数据不会太多,怎么玩都不会出问题。
当数据量较多的时候自然不能这样写。

还有上面各种一堆人上来直接就开喷,开怼,真的就是二极管
micean
2022-02-22 11:07:32 +08:00
写 sql 不让写 join ,等于残废
既然不让写,为什么不 jpa cache 上全套?
Huelse
2022-02-22 11:08:26 +08:00
话说戾气不要这么重吧?

首先每个人都有自己的编程习惯,甚至一些自身的小癖好,换他人都不一定敢直接说出来

其次环境不同,我们也不知道楼主写的什么业务,用的什么框架什么编程语言,基本就凭楼主贴出的 sql 就开骂

逮着一点不放直接骂的,在我看来不是非常骄傲且牛逼的大佬就是傻逼
moxiaowei
2022-02-22 11:12:00 +08:00
@micean 没有不让 join ,只是不提倡太多次 join
Goat121
2022-02-22 11:30:24 +08:00
如果是接触过 ERP 的,见过数据库里几百上千行的存储过程和触发器
就真不会觉得这算复杂 sql 了
hhjswf
2022-02-22 11:35:02 +08:00
反正我的习惯就是 sql 能简单尽量简单,多表能连尽量连。
stephanew
2022-02-22 11:36:31 +08:00
@SuperXRay 58 楼算客观陈述的话,我觉得 96 楼也是啊。另外问一句,你们这种优越感是从哪里来的?
07ly
2022-02-22 11:38:20 +08:00
@Livid OP 人身攻击
lolizeppelin
2022-02-22 11:49:58 +08:00
oracle 真是没落了....以前用 oracle 的存储里大把几千行的代码 233333

小 case 了!
caixiangyu17
2022-02-22 11:50:15 +08:00
见过 6000+行的 c#方法用来拼接一个 sql ,你能理解有多崩溃么?
WFDAK
2022-02-22 11:50:25 +08:00
借楼问一下,大家会不会把 SQL 语句写在代码了啊?
krixaar
2022-02-22 11:52:43 +08:00
@lolizeppelin #157 正在用 oracle 的感觉管你什么复杂逻辑几百行 sql 往里塞就行了真不错🤣

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

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

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

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

© 2021 V2EX