数据表:
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的执行思路?谢谢!
把条件稍微改一下 你应该就理解了
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中的第一条数据会被删除。
哇!你说例子我就恍悟了,谢谢!
思路?大哥你几年级的
看条件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长度最大的
3条的conID都相同,用眼睛看就好了!看题意就知道是留下GeoNo长度最大的!这条语句我看着就是在进行自连接操作,我不懂的是len(GeoNo)>len(t.GeoNo)这个条件是怎么筛选的?我是新手,麻烦大哥说下内在的东西吧,谢谢!
@回忆似水:麻痹,
其实都好简单的.
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号)
嗯!谢谢!len(GeoNo)>len(t.GeoNo)这个条件我就走不通了,看着这条sql语句是进行的自连接啊,两个表相同,这个条件是怎么筛选的啊?新手求教!
看着是自连接啊!前两条数据是怎么满足len(GeoNo)>len(t.GeoNo)这个条件的,第三条数据就不满足了啊!