仙人指路:个简单的SQL语句如何写?

ycdch 2000-06-20 03:49:00
本人在数据库编程中碰到一个不知如何写的SQL语句,有请高手“仙人指路”:
数据的情况如下:
I表 II表
name number name number
b 12 b 1
c 13 d 7
d 16 b 2
要求:I表number减去II表中相关记录的number;II表name有重复,但都是I表中name(即多对一的关系);
操作后I表:b 9;c 13;d 9;

请问:其SQL语句如何写?急!!急!! 谢!!谢!!
chervon@sina.com
...全文
320 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fxx 2000-06-29
  • 打赏
  • 举报
回复
Update I SET Number = (SELECT NVL(SUM(II.Number),0) FROM II
WHERE I.Name = II.Name);
sSam 2000-06-27
  • 打赏
  • 举报
回复
ycdch 的写法对吗,我看,不见得
还是采用TANGHUAN的办法吧
guofupei 2000-06-23
  • 打赏
  • 举报
回复
create view view2 as
select distinct name,sum(number) number from table2;
create view result as
select name,a1.number-a2.number
from table1 a1,view2 a2
where a1.name(+)=a2.name

this is for oracle
i want it have som help for u
!
ycdch 2000-06-23
  • 打赏
  • 举报
回复
假设表1名为Table1, 表2名为table2 我们通常在SQL Server或Oracle这样写:
select name, sum(number) number
from (
select name, number number
from table1
union all
select name, - sum(number) number
from table2
group by name
) order by 1
sSam 2000-06-21
  • 打赏
  • 举报
回复
另外,如果你用的是db2,那么以上语句就是正确的;其他的数据库吗,你就想办法改写吧
sSam 2000-06-21
  • 打赏
  • 举报
回复
update I set number=number-(select sum(number) from II where II.name=I.name)
这是个错误的语句,但就是这个意思;用循环去做吧
tanghuan 2000-06-21
  • 打赏
  • 举报
回复
如果II表的数据量小用sSam的方法好,因为他会使用多次子查询

如果II表的数据量大用下面的语句将使用一次子查询和一次连接

update I set I.number=I.number - temp.number
from I,(select name,sum(number) as number
from II
group by name
) as temp
where I.name=temp.name
swordmanli 2000-06-21
  • 打赏
  • 举报
回复
如果数据量较大:(在SQL Server中)
select name, sum(number)
into #tmp
from I
group by name

union all
select name, -sum(number)
from II
group by name

select name, sum(number)
from III
group by name

delete I

insert I
select *
from #tmp

这种方法的速度要快于连接后,作update
corao 2000-06-21
  • 打赏
  • 举报
回复
利用中间表(group by II表)
ycdch 2000-06-20
  • 打赏
  • 举报
回复
感谢各位的回复!!
以上的信息不全:本人用的是vb6。
感谢TopHead,gx_sunny,以及一切光顾/关照本问题的“仙人”。
gx_sunny 2000-06-20
  • 打赏
  • 举报
回复
我想问一句,你用的是什么数据库开发工具,比如VB,DELPHI什么的?
TopHead 2000-06-20
  • 打赏
  • 举报
回复
我是用Access试验的,首先将表II的数据按name汇总成表III,其中的内容为
name number
b 3
d 7

然后通过下面的sql能得到你想要的结果:
SELECT I.name,I.number-iif(isnull(III.number),0,III.number) from I left join III on I.name=III.name

不知有没有更好的办法:)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧