--处理表重复记录(查询和删除)
/******************************************************************************************************************************************************
1、Num、Name相同的重复值记录,没有大小关系只保留一条
2、Name相同,ID有大小关系时,保留大或小其中一个记录
整理人:中国风(Roy)日期:2008.06.06
******************************************************************************************************************************************************/--1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)--> --> (Roy)生成測試數據
 
if not object_id('Tempdb..#T') is null
    drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
Insert #T
select 1,N'A',N'A1' union all
select 2,N'A',N'A2' union all
select 3,N'A',N'A3' union all
select 4,N'B',N'B1' union all
select 5,N'B',N'B2'
Go
--I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
方法1:
Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)这个语句看得我有点迷糊。请帮忙分析一下,我理解的刚好结果相反。
Select * from #T a where exists(select 1 from #T where Name=a.Name and ID<a.ID)

解决方案 »

  1.   

    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)到表中去查询,设置它的别名为 a,此表所检索到的行的name和ID拿到子查询中去对比,如果子查询中能查到Name=a.name 即同名,ID<a.ID即ID小于当前主查询中扫描到的那个id,那就不算数.
    结果,找出表中任一 name 其 ID 最小的行.
      

  2.   

    这个句子翻译过来就是  用子查询与外面的#表对比 不存在NAME相等 ID比外面的小的值 当然就是最小值了
      

  3.   

    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)
    我开始是这样理解的,子查询查出的结果是NAME相同,ID小于主表ID的记录,
    那么加上not exists,结果就是ID比最小的大的那些结果。
      

  4.   

    注意看這兩個位置ID<a.ID+not exists和ID<a.ID+exists
      

  5.   


    应该是说,如果找得到 NAME相同,ID小于主表ID的记录 就不满足查询条件.
      

  6.   

    ID<a.ID+not existsa.ID大於Name相同的任何一個ID,滿足條件不成立
    當Name相同ID最小,不滿足條件所以成立ID<a.ID+exists
    a.ID大於Name相同的任何一個ID,滿足條件成立
    當Name相同ID最小,滿足條件所以不成立