表: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
先来道个歉,之前写的sql大多没有经过验证,也懒得用测试数据测试。而且没有讲解到底应该怎么写,为什么这么写。
当初自己数据库还挂过科,现在工作这么多年,也仅仅是会写些sql而已,希望楼主如果可以的话,还是好好学学比较好。
先将bc做连接,然后根据Manufacturer,X_ProName,对intViNv做合计,这一步楼主明白吧。
然后在将a和bc连接,对StockNum做更新。
思路就是这样,写法就是小季同学的写法。
谢谢!
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'
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
(0 行受影响)
@icbase: 你的回答太草率了,我只不过没环境测试,外加你的A\B\C命名太不规范,但我肯定我这个写法没错,而且是最高效的SQL。
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)
报错:关键字 'select' 附近有语法错误。
@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
@peace-lee: 只是指针对于一个厂商,只针对于所有
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,思考的时候可以先写分开的语句在合成一个语句。
谢谢
我是小季,已给你解决,豆要给我哦!
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
@小季同学: 谢谢!