刚写了一个感觉灰常复杂的 sql,感觉可读性不强啊,有什么好招 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
refresh
V2EX    数据库

刚写了一个感觉灰常复杂的 sql,感觉可读性不强啊,有什么好招

  •  
  •   refresh 2015-10-14 20:30:44 +08:00 2785 次点击
    这是一个创建于 3725 天前的主题,其中的信息可能已经有所发展或是发生改变。
    UPDATE order_items AS U1 INNER JOIN (SELECT X.provider_id, X.product_id, X.order_id, X.model_id, Y.qty, (SELECT M.price * N.discount FROM quotation AS M LEFT JOIN quotation_discount N ON M.provider_id = N.provider_id AND M.product_id = N.product_id WHERE M.model_id = X.model_id AND M.provider_id = X.provider_id AND Y.qty BETWEEN N.min_quantity AND N.max_quantity) AS price FROM (SELECT A.model_id, A.order_id, B.provider_id, C.product_id FROM order_inquiry_items A LEFT JOIN order_inquiry B ON A.order_inquiry_id = B.id LEFT JOIN product_model C ON A.model_id = C.id WHERE A.order_id = 23 AND B.provider_id = 14 AND C.product_id = 1) AS X LEFT JOIN order_items Y ON X.model_id = Y.model_id AND X.model_id = Y.model_id) AS U2 ON U1.order_id = U2.order_id AND U1.model_id = U2.model_id SET U1.price = U2.price 
    17 条回复    2015-10-19 09:28:47 +08:00
    gamecreating
        1
    gamecreating  
       2015-10-14 20:51:59 +08:00
    ........
    jjx
        2
    jjx  
       2015-10-14 20:54:27 +08:00
    用 sqlalchemy sql expression 写
    mahone3297
        3
    mahone3297  
       2015-10-14 21:14:29 +08:00
    感觉 lz 的缩进,已经非常合理了吧。。。。
    vibbow
        4
    vibbow  
       2015-10-14 21:15:31 +08:00
    把注释写清楚,然后以后再也不要碰这段 sql
    thinkif
        5
    thinkif  
       2015-10-14 22:08:22 +08:00
    如果数据库支持的话,能用 CTE ,事情就明了多了
    XianZaiZhuCe
        6
    XianZaiZhuCe  
       2015-10-14 22:09:37 +08:00 via Android
    能写出来就很了不起。。。
    echo1937
        7
    echo1937  
       2015-10-14 22:09:38 +08:00
    不知道表结构,看到这么长的 SQL 都不想看下去。
    WispZhan
        8
    WispZhan  
       2015-10-14 22:16:05 +08:00
    和我最近写个几个很相似,起码我已经找不到办法了。只能注意缩进和注释。如果楼下有好办法,请 @我一下,谢谢。
    hinate
        9
    hinate  
       2015-10-14 22:33:12 +08:00 via Android
    如果是在代码里的话就分开在拼装→_→
    zonghua
        10
    zonghua  
       2015-10-15 00:03:12 +08:00 via iPhone
    应该在应用程序里面做,而不是数据库?
    shenqiu2015
        11
    shenqiu2015  
       2015-10-15 00:05:28 +08:00
    首先,这个思路就错了,如楼上所说,复杂的业务逻辑用程序做,别用数据库
    arslion
        12
    arslion  
       2015-10-15 00:17:26 +08:00
    赞同 4L 哈哈哈哈哈
    cxbig
        13
    cxbig  
       2015-10-15 00:51:18 +08:00
    如果只是临时调试,用一用还可以。项目里最好用数据库抽象层的面向对象方式来定义功能。
    Strikeactor
        14
    Strikeactor  
       2015-10-15 00:57:25 +08:00
    人看着都晕的东西,你还希望数据库的性能优化器能看明白?
    adexbn
        15
    adexbn  
       2015-10-15 08:36:31 +08:00 via iPhone
    尽量在程序里实现,尽量不要组装大 SQL ,可以把一部分逻辑先固化成表或者视图(比如你的两个 select join ),最后,如果真的会出现这么复杂的 SQL ,想一下业务逻辑是不是哪里不合理
    htc502
        16
    htc502  
       2015-10-17 15:54:36 +08:00
    X , Y , U1 , U2 也许该有个更合适的名字。。。
    Reficul
        17
    Reficul  
       2015-10-19 09:28:47 +08:00
    内核恐慌里面那个主持人据说写了上千行的 SQL...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     895 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:20 PVG 06:20 LAX 14:20 JFK 17:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86