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

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

  •  
  •   refresh Oct 14, 2015 2963 views
    This topic created in 3863 days ago, the information mentioned may be changed or developed.
    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_i = 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 replies    2015-10-19 09:28:47 +08:00
    gamecreating
        1
    gamecreating  
       Oct 14, 2015
    ........
    jjx
        2
    jjx  
       Oct 14, 2015
    用 sqlalchemy sql expression 写
    mahone3297
        3
    mahone3297  
       Oct 14, 2015
    感觉 lz 的缩进,已经非常合理了吧。。。。
    vibbow
        4
    vibbow  
       Oct 14, 2015
    把注释写清楚,然后以后再也不要碰这段 sql
    thinkif
        5
    thinkif  
       Oct 14, 2015
    如果数据库支持的话,能用 CTE ,事情就明了多了
    XianZaiZhuCe
        6
    XianZaiZhuCe  
       Oct 14, 2015 via Android
    能写出来就很了不起。。。
    echo1937
        7
    echo1937  
       Oct 14, 2015
    不知道表结构,看到这么长的 SQL 都不想看下去。
    WispZhan
        8
    WispZhan  
       Oct 14, 2015
    和我最近写个几个很相似,起码我已经找不到办法了。只能注意缩进和注释。如果楼下有好办法,请 @我一下,谢谢。
    hinate
        9
    hinate  
       Oct 14, 2015 via Android
    如果是在代码里的话就分开在拼装→_→
    zonghua
        10
    zonghua  
       Oct 15, 2015 via iPhone
    应该在应用程序里面做,而不是数据库?
    shenqiu2015
        11
    shenqiu2015  
       Oct 15, 2015
    首先,这个思路就错了,如楼上所说,复杂的业务逻辑用程序做,别用数据库
    arslion
        12
    arslion  
       Oct 15, 2015
    赞同 4L 哈哈哈哈哈
    cxbig
        13
    cxbig  
       Oct 15, 2015
    如果只是临时调试,用一用还可以。项目里最好用数据库抽象层的面向对象方式来定义功能。
    Strikeactor
        14
    Strikeactor  
       Oct 15, 2015
    人看着都晕的东西,你还希望数据库的性能优化器能看明白?
    adexbn
        15
    adexbn  
       Oct 15, 2015 via iPhone
    尽量在程序里实现,尽量不要组装大 SQL ,可以把一部分逻辑先固化成表或者视图(比如你的两个 select join ),最后,如果真的会出现这么复杂的 SQL ,想一下业务逻辑是不是哪里不合理
    htc502
        16
    htc502  
       Oct 17, 2015
    X , Y , U1 , U2 也许该有个更合适的名字。。。
    Reficul
        17
    Reficul  
       Oct 19, 2015
    内核恐慌里面那个主持人据说写了上千行的 SQL...
    About     Help     Advertise     Blog     API     FAQ     Solana     5791 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 88ms UTC 02:46 PVG 10:46 LAX 19:46 JFK 22:46
    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