|
查看: 1728|回复: 18
|
有没有高手,可以把以下SQL语句再简化?
[复制链接]
|
|
|
可以把以下SQL语句再简短吗?
UPDATE WM_order_header SET Reference_no = wod.Lot_No
FROM WM_order_header woh
Inner Join WM_order_Details wod ON woh.ID = wod.WM_Order_Header_ID
WHERE woh.ID IN
(
SELECT woh.ID
From WM_order_header woh
Inner Join wM_order_Details wod ON woh.ID = wod.WM_Order_Header_ID
GROUP BY woh.id
having count (distinct wod.Lot_No) = 1
)
[ 本帖最后由 文世杰 于 4-6-2008 10:29 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 30-5-2008 09:33 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 30-5-2008 04:43 PM
|
显示全部楼层
|
可以解释你要的效果和 database structure 吗? |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 30-5-2008 06:48 PM
|
显示全部楼层
WM_order_header 是header
WM_order_Details 是 details
header 对 details 是一对多
假如所有details 的lot_no 都是一样的就把details 的lot_no 复制去header 的reference_no
[ 本帖最后由 文世杰 于 3-6-2008 11:09 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 3-6-2008 12:07 AM
|
显示全部楼层
- UPDATE WM_Order_Header
- SET Reference_no = (
- SELECT DISTINCT wod.Lot_No
- FROM WM_Order_Details wod
- WHERE wod.WM_Order_Header_ID = WM_Order_Header.id )
- WHERE id IN (
- SELECT WM_Order_Header_ID
- FROM WM_Order_Details
- GROUP BY WM_Order_Header_ID
- HAVING COUNT (DISTINCT lot_no) = 1 )
复制代码
想了很久还是想不到,这个与你的相差不多。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 3-6-2008 11:12 AM
|
显示全部楼层
|
感谢回复, 我们再想一想吧, 没有其他人要尝试吗? |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 4-6-2008 10:29 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 4-6-2008 12:15 PM
|
显示全部楼层
回复 5# pony 的帖子
你的代码第三行有错误
我改正了
UPDATE WM_Order_Header
SET Reference_no = (
SELECT Top 1 wod.Lot_No
FROM WM_Order_Details wod
WHERE wod.WM_Order_Header_ID = WM_Order_Header.id
)
WHERE id IN (
SELECT WM_Order_Header_ID
FROM WM_Order_Details
GROUP BY WM_Order_Header_ID
HAVING COUNT (DISTINCT lot_no) = 1 )
select * from WM_Order_Header
不过这个写法比我的还长 , 再想想吧。 |
|
|
|
|
|
|
|
|
|
|
发表于 16-6-2008 11:44 PM
|
显示全部楼层
回复 8# 文世杰 的帖子
一个set clause跟一个where clause,应该不能再简化了
以下的sql简化了些但是变成没有where clause去filter了
UPDATE WM_Order_Header woh SET Reference_no =
IFNULL((SELECT CASE min(Lot_No) WHEN max(Lot_No) THEN min(Lot_No) ELSE Reference_no END
FROM WM_Order_Details wod WHERE wod.WM_Order_Header_ID = woh.id
GROUP BY WM_Order_Header_ID), Reference_no); |
|
|
|
|
|
|
|
|
|
|
发表于 18-6-2008 09:05 AM
|
显示全部楼层
原帖由 cristiano~7 于 16-6-2008 11:44 PM 发表 
一个set clause跟一个where clause,应该不能再简化了
以下的sql简化了些但是变成没有where clause去filter了
UPDATE WM_Order_Header woh SET Reference_no =
IFNULL((SELECT CASE min(Lot_No) WHEN max(Lot_ ...
写个Stored Procedure,每次要用到时可以Call Stored Procedure 就可以了,很方便。 |
|
|
|
|
|
|
|
|
|
|
发表于 19-6-2008 09:59 AM
|
显示全部楼层
how about this ?
UPDATE WM_order_header
SET Reference_no = wod.Lot_No
FROM WM_order_header woh
Inner Join WM_order_Details wod
ON woh.ID = wod.WM_Order_Header_ID
WHERE exists
(
SELECT 1
from
WM_order_Details wod1
where woh.ID = wod1.WM_Order_Header_ID
GROUP BY wod1.WM_Order_Header_ID
having count (distinct wod1.Lot_No) = 1
) |
|
|
|
|
|
|
|
|
|
|
发表于 4-7-2008 05:21 PM
|
显示全部楼层
回复 1# 文世杰 的帖子
UPDATE WM_order_header SET Reference_no = Sub.Lot_No
FROM WM_order_header woh
INNER JOIN
(SELECT ID, Lot_No FROM
WM_order_Details
GROUP BY id
having count (distinct wod.Lot_No) = 1) woh
ON woh.ID = woh.id
行得通没有? |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 11-7-2008 09:35 AM
|
显示全部楼层
不好意思, 今天才看到你们的会复。
twigky 的 sql 有 error : The correlation name 'woh' is specified multiple times in a FROM clause.
woh 重复了 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 11-7-2008 09:42 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 11-7-2008 09:45 AM
|
显示全部楼层
cristiano~7 的 可能用不一样的database 吧, 我改成以下才能用
UPDATE WM_Order_Header SET Reference_no =
IsNULL(
(SELECT CASE min(Lot_No) WHEN max(Lot_No) THEN min(Lot_No) ELSE Reference_no END
FROM WM_Order_Details wod WHERE wod.WM_Order_Header_ID = woh.id
GROUP BY WM_Order_Header_ID)
, woh.Reference_no)
From WM_Order_Header woh |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 11-7-2008 10:22 AM
|
显示全部楼层
从你们的提示我想到可以改成这样:
UPDATE WM_Order_Header SET Reference_No = wod.Lot_No
FROM WM_Order_Header woh
INNER JOIN WM_Order_Details wod ON woh.ID = wod.WM_Order_Header_ID
WHERE WM_ORDER_HEADER_ID IN
(
SELECT WM_Order_Header_ID
FROM
WM_Order_Details
GROUP BY WM_Order_Header_ID
HAVING COUNT (DISTINCT Lot_No) = 1
)
或者这样:
UPDATE WM_Order_Header SET Reference_No = wod.Lot_No
FROM WM_Order_Header woh
INNER JOIN
(
SELECT WM_Order_Header_ID, max(Lot_No) as Lot_No
FROM
WM_Order_Details
GROUP BY WM_Order_Header_ID
HAVING COUNT (DISTINCT Lot_No) = 1
) wod ON wod.WM_Order_Header_ID = woh.id |
|
|
|
|
|
|
|
|
|
|
发表于 19-7-2008 12:53 AM
|
显示全部楼层
原帖由 文世杰 于 11-7-2008 09:35 AM 发表 
不好意思, 今天才看到你们的会复。
twigky 的 sql 有 error : The correlation name 'woh' is specified multiple times in a FROM clause.
woh 重复了
哈~ 不好意思!
只是直打。。
把alias和主table用了同样名。。
我看你自己改了,不用重复~ |
|
|
|
|
|
|
|
|
|
|
发表于 5-8-2008 03:13 AM
|
显示全部楼层
原帖由 文世杰 于 11-7-2008 10:22 发表 
从你们的提示我想到可以改成这样:
UPDATE WM_Order_Header SET Reference_No = wod.Lot_No
FROM WM_Order_Header woh
INNER JOIN WM_Order_Details wod ON woh.ID = wod.WM_Order_Header_ID
WHERE WM_ORDER_HEADER_ID IN
(
SELECT WM_Order_Header_ID
FROM
WM_Order_Details
GROUP BY WM_Order_Header_ID
HAVING COUNT (DISTINCT Lot_No) = 1
)
if subquery return more then one result, it will hit prolem ? |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 5-8-2008 10:57 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|