十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
从中取出所有nck相同的hweight的值,是更新到所有nck相同的数据的hweight2字段中么?
员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。创新互联坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供成都网站制作、网站建设、微信公众号开发、电商网站开发,成都小程序开发,软件按需规划网站等一站式互联网企业服务。
这个是更新所有数据的hweight2为hweight的累加。
update tab a set hweight2=(select sum(hweight) from tab b where a.nck=b.nck group by nck);
更新hweight3的值
update tab a set hweight3=hweight1-hweight-hweight2;
取值。
select hweight2,hweight3 from tab
这个累加可以写在存储过程中,在java中调用,也可以在java里面执行update语句。
Create Sequence MySequence Start With 1 Increment By 1 Nocycle Nocache;说明:序列MySequence从1开始递增,每次加1,一直累加不循环。若把Nocache改为Cache,那么Oralce会在内存中预先放置一些Sequence以使存取速度更快。Cache取完后,Oracle会自动再取一组到Cache 。然而使用Cache可能会跳号,若遇到数据库突发异常,Cache里的Sequence会丢失。然后创建触发器:Create Or Replace Trigger MyTrigger Before Insert On TableName referencing old as old new as new for each rowbegin Select MySequence.NextVal To :new.ID From DUAL;end;
序列结合触发器实现自动增加效果。
Oracle:
前提是: create table test(id char(5),name char(10));
(1)建立sequence
create sequence test_id increment by 1 start with 1;
(2)建立触发器
A)执行命令ed test打开窗口,填写以下内容
create or replace trigger test_trigger
before insert
on test
for each row
declare
primary_key_value char(5);
begin
select test_id.nextval into primary_key_value from dual;
:new.id:=primary_key_value ;
end;
B)保存后,执行get test
C)然后执行/
如果/执行有错误的话,可以通过show error来显示错误并修改。
(3)
SQL insert into test(name) values('one');
已创建 1 行。
SQL select * from test;
ID NAME
----- ----------
1 one
通过创建序列来实现
ORACLE
SEQUENCE的简单介绍
在oracle中sequence就是所谓的
序列号
,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create
Sequence
你首先要有CREATE
SEQUENCE或者CREATE
ANY
SEQUENCE权限,
CREATE
SEQUENCE
emp_sequence
INCREMENT
BY
1
--
每次加几个
START
WITH
1
--
从1开始计数
NOMAXVALUE
--
不设置最大值
NOCYCLE
--
一直累加,不循环
CACHE
10;
一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回
sequence的当前值
NEXTVAL=增加sequence的值,然后返回
sequence
值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL
可以使用sequence的地方:
-
不包含
子查询
、snapshot、VIEW的
SELECT
语句
-
INSERT语句的子查询中
-
NSERT语句的VALUES中
-
UPDATE
的
SET中
可以看如下例子:
INSERT
INTO
emp
VALUES
(empseq.nextval,
'LEWIS',
'CLERK',7902,
SYSDATE,
1200,
NULL,
20);
SELECT
empseq.currval
FROM
DUAL;
但是要注意的是:
-
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT
BY值,然后返回增加后的值。CURRVAL
总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以
如果你在
同一个语句里面使用多个NEXTVAL,其值
就是不一样
的。明白?
-
如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。
使用cache或许会跳号,
比如数据库突然不正常down掉(shutdown
abort),cache中的sequence就会丢失.
所以可以在create
sequence的时候用nocache防止这种情况。
2、Alter
Sequence
你或者是该sequence的owner,或者有ALTER
ANY
SEQUENCE
权限才能改动sequence.
可以alter除start至以外的所有sequence参数.如果想要改变start值,必须
drop
sequence
再
re-create
.
Alter
sequence
的例子
ALTER
SEQUENCE
emp_sequence
INCREMENT
BY
10
MAXVALUE
10000
CYCLE
--
到10000后
从头开始
NOCACHE
;
影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES
=设置能同时被cache的sequence数目。
可以很简单的Drop
Sequence
DROP
SEQUENCE
order_seq;
如果是数据累加的话,可以通过sum函数来实现,如果是计数的话,可以通过count来实现。
sql:select username ,count(accountNo) as count,sum(amount) as amount
from tablename order by username desc group by username;
以上就可以求出username下,accountNo的条数和对应的总amount,之后通过username字段降序排序。