表字段值 
ID       int  
SN       nvarchar(50)
Gtemp    nvarchar(50)
Indate   nvarchar(50)
Gstemp   nvarchar(50)
SunStren nvarchar(50)
gel      nvarchar(50)数据值
 ID  Sn   Getmp  indate   Gstemp  Sunstren  gel
 1  111   aaa  2010-01-01  aaa        30     30
 2  222   bbb  2010-01-01  bbb        30     30
 3  333   ccc  2010-01-01  ccc       30      30
 4  111   ddd  2010-01-01  ddd        30    30
我想选取 sn 不重复包含重复一列的所有数据 sql语句该怎样写呢??

解决方案 »

  1.   

    select * from Table where Id in(select max(Id) from Table group by Sn)
      

  2.   

     select * from Data where SN in ( select distinct sn from Data) 
    这样写怎么不对呢?
      

  3.   

    这个当然不对了SN又不是唯一的,in的语法是说你SN只要在in里面就可以了,那么111这个SN的第一条记录和第四条记录都满足的,所以你这个写法只是饶了一个弯子找所有记录。还有建议尽量别使用inselect * from Data a where not exists(select 1 from data b where a.SN= b.SN and a.id>b.id )这个意思是找出不同的SN的记录以及如果SN相同的记录找ID最小的那条记录
      

  4.   


    你这样写会把所有的数据都查出来的,select distinct sn from Data会查出所有的sn(111,222,333)
    你再想想select * from Data where SN in ( ‘111’,‘222’,‘333’) 
    是不是就会查出所有数据3楼的是正解,按sn分组,查出每组最大的一个id,这样sn有几组就有几个id
      

  5.   

    select distinct xxxx from table
    distinct 有区别的 独特的
      

  6.   

    你用exist更不好,应该这样select * from data as A 
    where A.id = (select max(id) from data as B where B.sn = A.sn)
      

  7.   

    你说的没怎么明白呢,不知道是不是这样呢?就是查所有的数据去掉重复的就行了?
    select distinct sn from 表名
      

  8.   

    还有个问题就是我的ID已经定义为自动增长列,我在写insert 语句时为它赋什么值时它能够从1开始自动增长?
      

  9.   

    select * from TableName where ID in (select ID=min(ID) from TableName group by Sn) 
    或者
    select a.* from TableName as a inner join(select ID=min(ID) from TableName group by Sn) as b on a.ID =b.ID 都可以
      

  10.   

    sorry,应该使用exist,这个更快