首页 新闻 赞助 找找看

sqlserver删除数据冗余,高手请解释下!thank you

0
悬赏园豆:20 [已解决问题] 解决于 2012-07-20 10:11

数据表:
CREATE TABLE tb_Table
(
ID int IDENTITY(1,1) NOT NULL,
GeoNO varchar(50) NOT NULL,
Title varchar(100) NULL,
ConID varchar(50) NULL
)

Insert into tb_Table (GeoNo,Title,ConID) values ('01','北京','1000')
Insert into tb_Table (GeoNo,Title,ConID) values ('0101','海淀区','1000')
Insert into tb_Table (GeoNo,Title,ConID) values ('010101','上地','1000')

Insert into tb_Table (GeoNo,Title,ConID) values ('01','北京','1001')
Insert into tb_Table (GeoNo,Title,ConID) values ('0102','朝阳区','1001')
Insert into tb_Table (GeoNo,Title,ConID) values ('010201','北辰','1001')

Insert into tb_Table (GeoNo,Title,ConID) values ('01','北京','1002')
Insert into tb_Table (GeoNo,Title,ConID) values ('0103','昌平区','1002')
Insert into tb_Table (GeoNo,Title,ConID) values ('010301','回龙观','1002')

我想把上述数据入库后,再从表里删除数据,保留的数据是:
'010101','上地','1000'
'010201','北辰','1001'
'010301','回龙观','1002'
其他的数据则删除,即保证ConID是唯一的,而且GeoNo的值是最大。如何用SQL来实现?

上面是别人提问的,有个人的回答是这样的

delete t from  tb_Table t
whereexists( select1from  tb_Table where ConID=t.ConID andlen(GeoNo)>len(t.GeoNo))

我看了,但是我不明白,这句sql怎么会执行出那样的结果的,各位谁指导下这句sql的执行思路?谢谢!

回忆似水的主页 回忆似水 | 初学一级 | 园豆:184
提问于:2012-07-19 12:51
< >
分享
最佳答案
0

把条件稍微改一下 你应该就理解了

delete t from  tb_Table t
where exists ( select 1 from  tb_Table t2 where t2.ConID = t.ConID and len(t2.GeoNo) > len(t.GeoNo))

就是说  对于t中每条数据, 只要 t2 中 有任意一条数据 与 t当前数据 有相同的 ConID 并且 GeoNo 比 t当前的这条数据的 GeoNo  更长, 那么就将t 中这条数据删除 。

比如 t 中第一条数据 ('01','北京','1000' )  在t2 中有相同的 ConID 的有 ('01','北京','1000') , ('0101','海淀区','1000'),  ('010101','上地','1000')  有两条以上的数据都比 t的长,  于是 t中的第一条数据会被删除。

收获园豆:20
gunsmoke | 老鸟四级 |园豆:3592 | 2012-07-20 08:42

哇!你说例子我就恍悟了,谢谢!

回忆似水 | 园豆:184 (初学一级) | 2012-07-20 10:05
其他回答(2)
0

思路?大哥你几年级的

 

看条件where ConID=t.ConID andlen(GeoNo)>len(t.GeoNo)

Insert into tb_Table (GeoNo,Title,ConID) values ('01','北京','1000')
Insert into tb_Table (GeoNo,Title,ConID) values ('0101','海淀区','1000')
Insert into tb_Table (GeoNo,Title,ConID) values ('010101','上地','1000')

弄成

Insert into tb_Table (GeoNo,Title,ConID) values ('010101','上地','1000')

这3条的ConID相同,留下GeoNo长度最大的

a85295853 | 园豆:2 (初学一级) | 2012-07-19 13:20

3条的conID都相同,用眼睛看就好了!看题意就知道是留下GeoNo长度最大的!这条语句我看着就是在进行自连接操作,我不懂的是len(GeoNo)>len(t.GeoNo)这个条件是怎么筛选的?我是新手,麻烦大哥说下内在的东西吧,谢谢!

支持(0) 反对(0) 回忆似水 | 园豆:184 (初学一级) | 2012-07-19 15:12

@回忆似水:麻痹,

支持(0) 反对(0) a85295853 | 园豆:2 (初学一级) | 2012-07-19 15:47
0

 其实都好简单的.

1 delete t from  tb_Table t 
2 where exists( select 1 from  tb_Table where ConID=t.ConID and len(GeoNo)>len(t.GeoNo))

我们首先看一下这个:

select 1 from  tb_Table where ConID=t.ConID and len(GeoNo)>len(t.GeoNo)

这句sql语句的意思是:找出符合

1 ConID=t.ConID and len(GeoNo)>len(t.GeoNo)

的id号。

delete t from  tb_Table t where exists(符合的id号)
Hongten | 园豆:1768 (小虾三级) | 2012-07-19 13:44

嗯!谢谢!len(GeoNo)>len(t.GeoNo)这个条件我就走不通了,看着这条sql语句是进行的自连接啊,两个表相同,这个条件是怎么筛选的啊?新手求教!

支持(0) 反对(0) 回忆似水 | 园豆:184 (初学一级) | 2012-07-19 15:14

看着是自连接啊!前两条数据是怎么满足len(GeoNo)>len(t.GeoNo)这个条件的,第三条数据就不满足了啊!

支持(0) 反对(0) 回忆似水 | 园豆:184 (初学一级) | 2012-07-19 15:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册