主题:[请教] 以表1中编号为关键字,统计表2中相同编号的数量的SQL语句如何写?
北京惬意
[专家分:1330] 发布于 2010-01-24 09:24:00
表1中有字段BH(编号),以该BH为关键字,统计表2中相同编号的数量,也就是对表2中的SL求和,再把求和结果写入表1的N_SL。
SQL语句如应何写?十分感谢!
最后更新于:2010-01-25 13:02:00
回复列表 (共33个回复)
11 楼
afoxer [专家分:360] 发布于 2010-01-25 08:17:00
[quote]你知道你上面那句有啥影响么?。。。
数据一多 你全部UPDATE?对UPDATE不过滤 反而对UPDATA的结果过滤?
倘若原来那表1 的数量原来就有值 ,且某个BH不存在于表2 ,你直接也把他UPDATE为0?
[/quote]
说得太对了,那就再修正一下:
update 表1 set n_sl = (select sum(n_sl) from 表2 where bh = 表1.bh);
where bh in (select bh from 表2)
12 楼
狐说八道 [专家分:860] 发布于 2010-01-25 08:18:00
。。。。。。
13 楼
So_Show [专家分:470] 发布于 2010-01-25 08:51:00
很明显 你的之前写的效果也是一样。。。
你自己UPDATE过就知道。。。我直接写的 没测试
语句直接是MS-SQL格式写的 VFP中 自己加分号
你说的错是就 b 在应该在子句后面吧? 这点确实是错了,改下如下
SQL语句正常工作中是求精简,但清晰与效率应该是前提..
个人习惯用连接(join)也是为了以后维护,条件看起来清晰点..
update 表一 set a.N_SL=b.数量
from 表一 a inner join (select BH,sum(数量) as 数量 from 表二 group by BH) b on a.BH=b.BH
你觉得你自己写的语句是正常update?
正常程序 你那样的update自己会导致什么结果 你应该很清楚
表一 表二
物品 数量 物品 数量
A 0 A 10
B 0 A 20
C 0 B 30
如果表是这样 你的语句执行完全没错
那如果这样呢?
表一 表二
物品 数量 物品 数量
A 1 A 10
B 1 A 20
C 1 B 30
那你update后 C就变成0?A变成30?B变成30?
我说的也是求和。。
换句话说..如果表一有几W条记录 而表二只有那么几百条?
如果不过滤更新记录?A表所以记录都更新,那你UPDATE 几W条记录?
14 楼
狐说八道 [专家分:860] 发布于 2010-01-25 09:41:00
sorry,受前面答题内容sum()的影响,是我看错题了(‘统计’而不是‘求和’),应该用count()而不是sum(),我再重来。。。
15 楼
狐说八道 [专家分:860] 发布于 2010-01-25 09:51:00
CREATE CURSOR 表2 ( bh i, sl i)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
CREATE CURSOR 表1 ( bh i, n_sl i)
INSERT INTO 表1 VALUES ( 1, 0)
INSERT INTO 表1 VALUES ( 2, 0)
INSERT INTO 表1 VALUES ( 3, 0)
INSERT INTO 表1 VALUES ( 4, 0)
INSERT INTO 表1 VALUES ( 5, 0)
INSERT INTO 表1 VALUES ( 7, 1)
UPDATE 表1 SET N_SL = a.sl from (SELECT bh, count(*) sl FROM 表2 a GROUP BY a.bh) a WHERE 表1.bh=a.bh
brow
16 楼
北京惬意 [专家分:1330] 发布于 2010-01-25 09:57:00
楼上二位兄弟好:
更正一下,本人目的是求和,写成了统计。过去统称统计习惯,没表达的那么严格,抱歉!
17 楼
狐说八道 [专家分:860] 发布于 2010-01-25 10:04:00
‘统计表2中相同编号的数量’中的‘数量’改成‘个数’——这个大家就不会理解错了。一个错后面全错——教训,以为前面的人理解的对就没好好审题
18 楼
狐说八道 [专家分:860] 发布于 2010-01-25 10:07:00
怎么又变成‘求和’了?
能重写下你的题吗?(求和的字段是什么)
19 楼
狐说八道 [专家分:860] 发布于 2010-01-25 10:13:00
两个都写上:
CREATE CURSOR 表2 ( bh i, sl i)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
INSERT INTO 表2 VALUES ( 8, 60)
CREATE CURSOR 表1 ( bh i, n_sl i)
INSERT INTO 表1 VALUES ( 1, 0)
INSERT INTO 表1 VALUES ( 2, 0)
INSERT INTO 表1 VALUES ( 3, 0)
INSERT INTO 表1 VALUES ( 4, 0)
INSERT INTO 表1 VALUES ( 5, 0)
INSERT INTO 表1 VALUES ( 7, 1)
UPDATE 表1 SET N_SL = a.sl from (SELECT bh, count(*) sl FROM 表2 a GROUP BY a.bh) a WHERE 表1.bh=a.bh
brow
UPDATE 表1 SET N_SL = a.sl from (SELECT bh, sum(sl) sl FROM 表2 a GROUP BY a.bh) a WHERE 表1.bh=a.bh
brow
20 楼
北京惬意 [专家分:1330] 发布于 2010-01-25 12:56:00
[quote]怎么又变成‘求和’了?
能重写下你的题吗?(求和的字段是什么)[/quote]
抱歉!又在原题中加了一句“也就是对表2中的SL求和”,这回能好理解一些了吧?
我来回复