佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1727|回复: 18

有没有高手,可以把以下SQL语句再简化?

[复制链接]
发表于 29-5-2008 05:36 PM | 显示全部楼层 |阅读模式
可以把以下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 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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 | 显示全部楼层
  1. UPDATE WM_Order_Header
  2.   SET Reference_no = (
  3.     SELECT DISTINCT wod.Lot_No
  4.       FROM WM_Order_Details wod
  5.       WHERE wod.WM_Order_Header_ID = WM_Order_Header.id )
  6.   WHERE id IN (
  7.     SELECT WM_Order_Header_ID
  8.       FROM WM_Order_Details
  9.       GROUP BY WM_Order_Header_ID
  10.       HAVING COUNT (DISTINCT lot_no) = 1 )
复制代码


想了很久还是想不到,这个与你的相差不多。
回复

使用道具 举报

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

使用道具 举报

Follow Us
 楼主| 发表于 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

不过这个写法比我的还长 , 再想想吧。
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
soonyu 的可以用,而且比我的短。
回复

使用道具 举报

 楼主| 发表于 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
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层

回复 18# soonyu 的帖子

在 mssql 2000 里没有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 24-12-2025 01:01 PM , Processed in 0.126375 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表