需要一个复杂的update语句,请帮忙! 300分(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
需要一个update语句,更新关系比较复杂,我都晕了,就就我吧!
表A
=============
IDX PY PD NUMBER
11 01 111 100
12 02 222 200
13 03 333 300
11 01 222 102
11 02 111 102

表B
=============
IDX JG NUMBER
11 10 80
12 20 70
13 30 60

表C
=============
PY PD JS
01 111 101
01 333 100
02 222 200
02 229 200

要求:
用表A,C的数据更新表B的数据
更新关系公式为:
B.JG= ( B.JG*B.NUMBER + (A.NUMBER-B.NUMBER)*C.JS ) / A.NUMBER

其中:
A和B的IDX是一一对应的
A的PY,PD和C的PY,PD是一一对应的
 
update b set
b.jg=(b.jg*b.number+(a.number-b.number)*c.js)/a.number
where (a.idx=b.idx) and (a.py=c.py) and (a.pd=c.pd)
 
先保存下来,再慢慢想...
 
习习,我提出问题后就想出来了.和mutex的差不多,不过好像应该这样:
update b set b.jg=...
改成
update b,a,c set b.jg=...

不然好像报错说"参数不够"?

准备给mutex 250分, 大家看看还有没有别的什么问题?

睡觉去了,明天来看看.
 
Pipi.
不用想了,其实很简单嘛,我开始以为要将A,C表的全部数据都要更新,原来不是。

BTW:
》update b,a,c set b.jg=...
当我发现这个问题想回答时,我的ISP要升级。 又少的不少分~~~~~~~ {B-(
 
SQL Server上:

UPDATE B
SET B.JG = (B.JG * B.NUMBER + (A.NUMBER - B.NUMBER) * C.JS) / A.NUMBER
FROM (A INNER JOIN
B ON A.IDX = B.IDX) INNER JOIN
C ON (A.JD = C.PD) AND (A.PY = C.PY)
如果参与计算的字段不能保证不为空,最好判断一下空值,把空值转换为0.
而且 a.number 不为0
 
Mutex 的应改为:
UPDATE b
SET b.jg = (b.jg * b.number + (a.number - b.number) * c.js) / a.number
FROM a, b, c
WHERE (a.idx = b.idx) AND (a.py = c.py) AND (a.pd = c.pd)
 
怎么你们都认为 update b,a,c set ....
我查Tran-SQL手册,没有这种写法.
UPDATE 后只能是一个表名或视图名,不能同时更新多个表.
我知道沈兄是搞 oracle的, oracle是不是和 SQL7有很大区别?
 
确实还有问题:
我昨天是在家里用Access测试的,当时mutex的回答基本正确,
今天到公司在sql server 7.0上试验,发现gxg8816的回答更接近一些,
但是好像还有问题...我再想想....
 
我 A 表的字段名 JD 应为 PD,建表时写错名字了.
 
现在的问题是sql执行结果好像没有结果? 什么也没有更新.
我再把我的表结构说的清楚一点八:

表A
=========================
JDATA ANO NUMBER PDATE
01 136 1000 1999-12-01
01 137 1200 1999-12-01
02 136 1030 1999-12-01
02 137 1000 1999-12-01
01 136 1400 1999-12-02
01 137 1050 1999-12-02
02 136 1030 1999-12-02
02 137 1000 1999-12-02
....

表B
=========================
ANO LAST_01_S LAST_01_SV
136 100 1200
137 200 1100
....

表C
=========================
JDATE JJIESUAN PDATE
01 1300 1999-12-01
02 1250 1999-12-01
01 1400 1999-12-02
02 1550 1999-12-02
....
(上面结构中,凡是字段名相同的,就是一一对应的关系)

现在我用A,C表里面JDATE=01的数据更新B的LAST_01_S字段:
B.LAST_01_S=(B.LAST_01_S * B.LAST_01_SV + (A.NUMBER - B.LAST_01_SV) * C.JJIESUAN) / A.NUMBER

多谢了!
 
加把劲,分数大大的有!
 
cAkk,等会儿,
和01,136对应的a.number在A中有好几个,你打算怎么用?
 
对了,再加一个限制: PDATE=(一个已知的日期变量).

加油!
 
UPDATE B
SET B.LAST_01_S = (B.LAST_01_S * B.LAST_01_SV + (A.NUMBER - B.LAST_01_SV)
* C.JJIESUAN) / A.NUMBER
FROM (A INNER JOIN
B ON A.ANO = B.ANO) INNER JOIN
C ON (A.PDATE = C.PDATE) AND (A.JDATA = C.JDATA)
WHERE A.JDATA = '01' AND A.PDATE = '1999-12-01'
运行显示有两行更新.
 
UPDATE (a INNER JOIN c ON (a.PDATE = c.PDATE) AND (a.JDATA = c.JDATE)) INNER JOIN b ON a.ANO = b.ANO SET b.LAST_01_S = (.[LAST_01_S]*.[LAST_01_SV]+([A].[NUMBER]-.[LAST_01_SV])*[C].[JJIESUAN])/[A].[NUMBER]
WHERE (((a.JDATA)=1) AND ((c.PDATE)=#12/1/99#));
 
sorry:

UPDATE (a INNER JOIN c ON (a.PDATE = c.PDATE) AND (a.JDATA =
c.JDATE)) INNER JOIN b ON a.ANO = b.ANO SET b.LAST_01_S =
(.[LAST_01_S]*.[LAST_01_SV]+([A].[NUMBER]-.[LAST_01_SV])*
[C].[JJIESUAN])/[A].[NUMBER]
WHERE (((a.JDATA)=1) AND ((c.PDATE)=#12/1/99#));
 
成功了! 习习!
分数给mutex,他的语句基本上在Access上面通过了.

gxg8816到外面来拿分. :-)
 

Similar threads

后退
顶部