refresh
V2EX  ›  数据库

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

  •  
  •   refresh · Oct 14, 2015 · 3016 views
    This topic created in 3896 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_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 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   ·   5568 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 03:46 · PVG 11:46 · LAX 20:46 · JFK 23:46
    ♥ Do have faith in what you're doing.