SQL也能这样写

根据一个表的数据update另一个表数据的SQL语句通常如下:
Mysql语法:
[code]update T1 inner join (select ID, TYPE, sum(AMOUNT)
as NEW_AMOUNT from T2 group by ID, TYPE) as T3
on T1.ID = T3.ID and T1.TYPE = T3.TYPE
set T1.AMOUNT = T1.AMOUNT+T3.NEW_AMOUNT[/code]
SqlServer语法:
[code]update T1 set T1.AMOUNT = T1.AMONT+T3.NEW_AMOUNT
from T1 inner join (select ID, TYPE, sum(AMOUNT)
as NEW_AMOUNT from T2 group by ID, TYPE) as T3
on T1.ID = T3.ID and T1.TYPE = T3.TYPE [/code]

但不幸的是上面两种语法均不符合ANSI92的SQL标准,也不能在Hsql中使用。
难道ANSI92不支持这样常用的update功能吗?答案是否,使用如下的SQL语句
即可实现与上面写法相同的功能:

[code]update T1 set T1.AMOUNT = T1.AMOUNT+
(select sum(T2.AMOUNT) from T2
group by T2.ID, T2.TYPE
having T2.ID=T1.ID and T2.TYPE=T1.TYPE)[/code]

上述SQL在Hsql1.7.2和Mysql5.1下测试成功,测试数据如下:

[code]CREATE TABLE T1 (
ID varchar(255),
TYPE varchar(255),
AMOUNT decimal
);
CREATE TABLE T2 (
ID varchar(255),
TYPE varchar(255),
AMOUNT decimal
);[/code]

[code]delete from T2;
delete from T1;

insert into T2(ID,TYPE,AMOUNT)
values('0000000001', 'P', 10);
insert into T2(ID,TYPE,AMOUNT)
values('0000000001', 'P', 20);
insert into T2(ID,TYPE,AMOUNT)
values('0000000002', 'P', 30);

insert into T2(ID,TYPE,AMOUNT)
values('0000000001', 'N', 10);
insert into T2(ID,TYPE,AMOUNT)
values('0000000002', 'N', 20);
insert into T2(ID,TYPE,AMOUNT)
values('0000000002', 'N', 30);

insert into T1 values('0000000001', 'P', 0);
insert into T1 values('0000000001', 'N', 0);
insert into T1 values('0000000002', 'P', 0);
insert into T1 values('0000000002', 'N', 0);[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值