This topic has been archived. It cannot be replied.
-
工作学习 / 专业技术讨论 / SQL, 还是SQL。又来了。(bdbs的简化版)一个TABLE只有 一个COLUMN(ID), 有两条相同记录(ID =0), 如下:
ID
-----
0
0
要求一个标准的SQL UPDATE QUERY 把这两条记录改成为:
ID
-----
1
2
我没有答案.
-looi500(looi);
2006-11-27
{164}
(#3344295@0)
-
这个简化也够狠!要用标准SQL区分两个一模一样的行,确实是很难。
-newkid(newkid);
2006-11-27
(#3344564@0)
-
.
-poohbear(毛毛熊);
2006-11-27
(#3345203@0)
-
官方公布的都只有这样的解,很失望的说。:(
-bdbs(不多不少);
2006-11-27
(#3345650@0)
-
不行吗? 我没法试, 看着觉得挺明白的...
-poohbear(毛毛熊);
2006-11-28
(#3347538@0)
-
bdbs的TABLE没有UNIQUE KEY, 所以那些方法不适合.
-looi500(looi);
2006-11-29
(#3348316@0)
-
还是不信, 真拿单位去试了, 真不行, 而且结果毫无逻辑可言 ^_^ 不过, 真设计DB的时候, 可别整这种DD...
-poohbear(毛毛熊);
2006-11-30
(#3350796@0)
-
这不是设计缺陷。其实这是一个真实的应用。原始数据在DW里,全是normalized的。拿出来用的时候需要Denormalize穷尽所有变异及可能的组合。就需要在原来的ID上再加一个Sub ID。这个Sub ID可以在Denormalize的过程中加,也可以在Denormalize以后加。因为Attributes太多,在Denomalize的过程中加这个Sub ID不太现实,所以只能在之后加。也许有人会建议,为什么不在Denormalize的时候加一个Auto Increment Identity简单了事呢?原因在于原始数据太多,一旦Denormalized会产生不同的组合产生更多的数据,很有可能over flow。所以只能考虑用Sub ID比较安全。
-bdbs(不多不少);
2006-11-30
{304}
(#3350993@0)
-
简得好呀。理解很透彻。赞一个。
-bdbs(不多不少);
2006-11-27
(#3345648@0)
-
简化版可用Sequence. 听说SQL Server 不支持Sequence,那就换数据库。drop sequence seq;
create sequence seq start with 1 increment by 1;
create table tx(i1 int);
insert into tx values 0,0;
update tx set i1 = next value for seq where i1 = 0;
select * from tx;
-886xyz(cqcq);
2006-11-27
{199}
(#3345779@0)
-
Oracle stuff, MS does not support. Sequence needs to be used in tables in MS SQL.
-hard20(hard20);
2006-11-28
(#3346029@0)
-
更正一下,这是DB2.
-886xyz(cqcq);
2006-11-28
(#3346437@0)
-
ORACLE的SEQUENCE是无法保证连续的,(当你获取一个ID时,下一个连续的可能被其他事务获取并因回滚而丢弃),DB2的SEQUENCE也有类似问题吧?
-newkid(newkid);
2006-11-28
(#3346759@0)
-
是的。SEQUENCE是共享的,而且没有锁,所以不能保证连续。
-886xyz(cqcq);
2006-11-28
(#3346841@0)
-
当你CREATE SEQUENCE时需要给个名字,你控制怎么使用.怎么会共享呢?
-looi500(looi);
2006-11-29
(#3348296@0)
-
只要创建出来了,任何一个SESSION都可以用,当然是共享的。
-newkid(newkid);
2006-11-29
(#3348307@0)
-
一天学一点(没真正用过SEQUENCE). WITH NOCACHE, ROLLBACK也不回恢复SEQUENCE吗?
-looi500(looi);
2006-11-29
(#3350121@0)
-
SEQUENCE是种object. 存放在dd里,rollback 不能回滚SEQUENCE值.SEQUENC是共享的,但重要的SEQUENC在应用中都应该做到专用,所以,应用上SEQUENC的不连续大多数都是rollback造成的。
-hard20(hard20);
2006-11-29
(#3350190@0)
-
当你从SEQUENCE里面取值时,ORACLE会执行一个implicit commit(如果cache >1, 那么cache被用完时会有一个implicit commit). 因此这个值是不会回滚的。
-newkid(newkid);
2006-11-30
(#3350842@0)
-
如果是Oracle的话可以用rowid来区分完全相同的row. rowid值一定是唯一的。
-hard20(hard20);
2006-11-28
(#3347629@0)
-
if oracle: update table_name set id = rownum
-guanshui88(我就是来捣乱的);
2006-11-28
(#3346054@0)
-
Two SQL UPDATE StatementsTested in DB2 few times with 2048 rows(Assume ID is integer):
Update theTable Set ID= rand() * 100000000;
Update theTable a set ID = (select count(*) from theTable b where a.id >= b.id );
如果放去PRODUCTION, 感觉象个不定时炸弹. 如果用做PATCH还是可以的.
-looi500(looi);
2006-11-28
{262}
(#3346826@0)
-
如果用两个query自然好办。这里用rand()不太好,伪随机数很难保证不重复的。MSSQL可以用newid()。
-bdbs(不多不少);
2006-11-28
(#3346864@0)
-
尽量在找通用的SQL QUERY. RAND()绝大多数DATABASE都有.
-looi500(looi);
2006-11-28
(#3346903@0)
-
通过的办法就是建立一张新表,在新表中加一个增量为1的字段,把数据放到新的表里。保证不会出问题。如果是数据量很大的话。就当是个ETL好了.
-hard20(hard20);
2006-11-28
{16}
(#3347626@0)
-
ORACLE就没有自动递增的列。其实楼主的原题要求每组都从1开始,并不是全表唯一的序列号,这个被简化版忽略了。
-newkid(newkid);
2006-11-29
(#3348301@0)
-
放在临时表里后,有了全表唯一的序列号(一列肯定唯一的值),可以用连接查询实现他要的东西了吧?
-hard20(hard20);
2006-11-29
(#3350197@0)
-
呵呵,问题是你用什么逻辑实现连接呢?既然原表有重复行,你的连接结果就会有多余的行。
-newkid(newkid);
2006-11-30
(#3350814@0)
-
实际应用中采用全表唯一序列号有可能溢出。#3350993
-bdbs(不多不少);
2006-11-30
(#3351001@0)
-
In SQL Server 2000, I tested following.create table tmp_t(num int not null)
insert tmp_t(num) values(0)
alter table tmp_t add [id] int identity(1,1) not null
select * from tmp_t
-wuse(悟色);
2006-11-30
{147}
(#3352015@0)
-
mine in SQL Server 2kALTER TABLE theTable ADD TempID INT NOT NULL Identity(1,1)
UPDATE theTable SET ID = TempID
ALTER TABLE theTable DROP COLUMN TempID
-marsher(marsher);
2006-12-5
{133}
(#3360029@0)