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

2015-10-14 20:30:44 +08:00
 refresh
```sql

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

```
2305 次点击
所在节点    数据库
17 条回复
gamecreating
2015-10-14 20:51:59 +08:00
........
jjx
2015-10-14 20:54:27 +08:00
用 sqlalchemy sql expression 写
mahone3297
2015-10-14 21:14:29 +08:00
感觉 lz 的缩进,已经非常合理了吧。。。。
vibbow
2015-10-14 21:15:31 +08:00
把注释写清楚,然后以后再也不要碰这段 sql
thinkif
2015-10-14 22:08:22 +08:00
如果数据库支持的话,能用 CTE ,事情就明了多了
XianZaiZhuCe
2015-10-14 22:09:37 +08:00
能写出来就很了不起。。。
echo1937
2015-10-14 22:09:38 +08:00
不知道表结构,看到这么长的 SQL 都不想看下去。
WispZhan
2015-10-14 22:16:05 +08:00
和我最近写个几个很相似,起码我已经找不到办法了。只能注意缩进和注释。如果楼下有好办法,请 @我一下,谢谢。
hinate
2015-10-14 22:33:12 +08:00
如果是在代码里的话就分开在拼装→_→
zonghua
2015-10-15 00:03:12 +08:00
应该在应用程序里面做,而不是数据库?
shenqiu2015
2015-10-15 00:05:28 +08:00
首先,这个思路就错了,如楼上所说,复杂的业务逻辑用程序做,别用数据库
arslion
2015-10-15 00:17:26 +08:00
赞同 4L 哈哈哈哈哈
cxbig
2015-10-15 00:51:18 +08:00
如果只是临时调试,用一用还可以。项目里最好用数据库抽象层的面向对象方式来定义功能。
Strikeactor
2015-10-15 00:57:25 +08:00
人看着都晕的东西,你还希望数据库的性能优化器能看明白?
adexbn
2015-10-15 08:36:31 +08:00
尽量在程序里实现,尽量不要组装大 SQL ,可以把一部分逻辑先固化成表或者视图(比如你的两个 select join ),最后,如果真的会出现这么复杂的 SQL ,想一下业务逻辑是不是哪里不合理
htc502
2015-10-17 15:54:36 +08:00
X , Y , U1 , U2 也许该有个更合适的名字。。。
Reficul
2015-10-19 09:28:47 +08:00
内核恐慌里面那个主持人据说写了上千行的 SQL...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX