refresh
V2EX  ›  数据库

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

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