首页 新闻 搜索 专区 学院

求一条SQL语句,在线等!!谢谢!!!

0
悬赏园豆:30 [已解决问题] 解决于 2012-11-16 10:13

表:A

字段:厂商:Manufacturer   产品型号:X_ProName    库存:StockNum

数据:


表B:

原始名称:OldProName  厂商:Manufacturer   产品型号:X_ProName

表C:

原始名称:OldProName    库存:intVINV

表A和表B根据Manufacturer和X_ProName对应,

表B和表C根据OldProName对应

怎么更新A表的第一条数据中的StockNum=1+2+3+4=10

icbase的主页 icbase | 初学一级 | 园豆:93
提问于:2012-11-15 16:46
< >
分享
最佳答案
0

先来道个歉,之前写的sql大多没有经过验证,也懒得用测试数据测试。而且没有讲解到底应该怎么写,为什么这么写。

当初自己数据库还挂过科,现在工作这么多年,也仅仅是会写些sql而已,希望楼主如果可以的话,还是好好学学比较好。

先将bc做连接,然后根据Manufacturer,X_ProName,对intViNv做合计,这一步楼主明白吧。

然后在将a和bc连接,StockNum做更新。

思路就是这样,写法就是小季同学的写法。

收获园豆:10
飞来飞去 | 老鸟四级 |园豆:2057 | 2012-11-16 09:38

谢谢!

icbase | 园豆:93 (初学一级) | 2012-11-16 10:12
其他回答(5)
0

Update A  set StockNum=

(SELECT SUM(C.intVINV) FROM B,C WHERE B.OldProName   =C.OldProName   AND B.Manufacturer  ='FCI' AND B.OldProName  ='X5045')

where ProName  ='X5045' and Manufacturer  ='FCI'

夏小米_ | 园豆:220 (菜鸟二级) | 2012-11-15 16:59
0
UPDATE A SET A.StockNum = X.intVINV
FROM A,(SELECT B.X_ProName,SUM(C.intVINV) intVINV
FROM B,C
WHERE B.OldProName=C.OldProName
GROUP BY
B.X_ProName)X
WHERE A.Manufacturer = X.X_ProName
秦楼东 | 园豆:913 (小虾三级) | 2012-11-15 16:59

(0 行受影响)

支持(0) 反对(0) icbase | 园豆:93 (初学一级) | 2012-11-15 17:12

@icbase: 你的回答太草率了,我只不过没环境测试,外加你的A\B\C命名太不规范,但我肯定我这个写法没错,而且是最高效的SQL。

支持(0) 反对(0) 秦楼东 | 园豆:913 (小虾三级) | 2012-11-16 10:42
0

update a set StockNum=sum(select intVINV from c where OldProName=(select OldProName from b inner join a on b.X_proName=a.X_proName and b.Manufacturer=a.Manufacturer)

peace-lee | 园豆:202 (菜鸟二级) | 2012-11-15 17:26

报错:关键字 'select' 附近有语法错误。

支持(0) 反对(0) icbase | 园豆:93 (初学一级) | 2012-11-15 17:28

@icbase: 

update a set StockNum=sum(select intVINV from c where OldProName=(select OldProName from b where X_proName=x5045 and Manufacturer=FCI  ) where X_proName=x5045 and Manufacturer=FCI

支持(0) 反对(0) peace-lee | 园豆:202 (菜鸟二级) | 2012-11-15 17:30

@peace-lee: 只是指针对于一个厂商,只针对于所有

支持(0) 反对(0) icbase | 园豆:93 (初学一级) | 2012-11-15 17:32
0

update A set StockNum = (
      select sum(tmp.intVINV) from (select * from A as tmp3 ) as tmp2
      inner join (select B.*, C.intVINV as intVINV from C inner join B on C.OldProName = B.OldProName) as tmp
      on tmp.Manufacturer = tmp2.Manufacturer and tmp.X_ProName = tmp2.X_ProName
      group by tmp2.Manufacturer);
已测试, 没有问题。

注: 灰色部分,逻辑上可以用A代替, 但是sql目前不能执行update ..A..(select ...from A),即不能再同一语句中,先从该表中select,然后再用其结果update该表。你可以试一下。先把三个表join,然后group在sum,思考的时候可以先写分开的语句在合成一个语句。

收获园豆:20
ssun | 园豆:225 (菜鸟二级) | 2012-11-15 18:09

谢谢

支持(0) 反对(0) ssun | 园豆:225 (菜鸟二级) | 2012-11-16 10:19
1

我是小季,已给你解决,豆要给我哦!

班级中队长 | 园豆:94 (初学一级) | 2012-11-15 18:27

UPDATE A SET StockNum=T.Num
FROM (
SELECT Manufacturer,X_ProName,SUM(intViNv) AS Num
FROM B b INNER JOIN  C c ON b.OldProName=c.OldProName
GROUP BY Manufacturer,X_ProName
) AS T
WHERE A.Manufacturer=T.Manufacturer AND A.X_ProName=T.X_ProName

支持(0) 反对(0) 班级中队长 | 园豆:94 (初学一级) | 2012-11-15 18:28

@小季同学: 谢谢!

支持(0) 反对(0) icbase | 园豆:93 (初学一级) | 2012-11-16 10:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册