V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
refresh
V2EX  ›  数据库

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

  •  
  •   refresh · 2015-10-14 20:30:44 +08:00 · 2308 次点击
    这是一个创建于 3359 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   1755 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:28 · PVG 00:28 · LAX 08:28 · JFK 11:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.