select top 1 id,name,pp,qq from test where id not in (select top 2 id from test where id>100 order by id)上面这个语句,在MSSQL2000下是肯定能成功的,select top 2 id from test where id>100 order by id结果是表中id号大于100的数据中的头两行。再结合前面select top 1 id,name,pp,qq from test where id not in 能查到第三行的数据,但是在mssql2005中,始终只返回表中id号为1的那一行。是不是在mssql2005中不能用not in作为排除条件来查询??

解决方案 »

  1.   

    这个在2000和2005下结果是一样的。先要排除下你表中数据的问题。
    测试结果如下:
    2000中:
    ---------------------------------
    --  Author: HEROWANG(让你望见影子的墙)
    --  Date  : 2009-08-08 06:33:32
    ---------------------------------
     
    IF OBJECT_ID('[tb]') IS NOT NULL 
        DROP TABLE [tb]
    go
    CREATE TABLE [tb] (id INT,value VARCHAR(3))
    INSERT INTO [tb]
    SELECT 1,'www' UNION ALL
    SELECT 2,'dd' UNION ALL
    SELECT 101,'ddd' UNION ALL
    SELECT 102,'dfd' UNION ALL
    SELECT 103,'dfd' union all
    select 104,'dsf'select * from [tb]select top 1 * from tb where id not in (select top 2 id from tb where id>100 order by id) 
    id      value
    1 www
    2005中:---------------------------------
    --  Author: HEROWANG(让你望见影子的墙)
    --  Date  : 2009-08-08 06:33:32
    ---------------------------------
     
    IF OBJECT_ID('[tb]') IS NOT NULL 
        DROP TABLE [tb]
    go
    CREATE TABLE [tb] (id INT,value VARCHAR(3))
    INSERT INTO [tb]
    SELECT 1,'www' UNION ALL
    SELECT 2,'dd' UNION ALL
    SELECT 101,'ddd' UNION ALL
    SELECT 102,'dfd' UNION ALL
    SELECT 103,'dfd'select * from [tb]select top 1 * from tb where id not in (select top 2 id from tb where id>100 order by id) id value
    1 www
      

  2.   

    (select top 2 id from test where id>100 order by id) 返回 101,102所以整个sql返回101,102之外的第一条,因为没有order by,它返回1,也正常
      

  3.   

    除 ID = 101, 102.后的所有记录的头一条是返回ID = 1
      

  4.   

    你写少了条件
    select top 1 id,name,pp,qq 
    from test 
    where id not in (select top 2 id from test where id>100 order by id) 
    and id>100
      

  5.   

    楼上在sql2000中对"select top 1 id,name,pp,qq from test where id not in (select top 2 id from test where id>100 order by id)
    "的理解有误,有可能是受分页存储过程的影响
      

  6.   

    楼主 select top m * from tablename where id not in (select top n * from tablename)这样才是你取n后面的到m的记录
      

  7.   


      把 order by id desc 放到外面一层的select 试试.
      

  8.   

    select top 1 id,name,pp,qq 
    from test 
    where id not in (select top 2 id from test where id>100 order by id) 
    --以上条件只是排除了id为101 和102 ,剩下的记录是id 1-100 103-。
    要想取103.。。
    加条件
    and id>100select top 1 id,name,pp,qq 
    from test 
    where id not in (select top 2 id from test where id>100 order by id) 
    and id>100
      

  9.   

    select top 1 id,name,pp,qq from test where id not in (select top 2 id from test where id>100 order by id) 上面这个语句,在MSSQL2000下是肯定能成功的,select top 2 id from test where id>100 order by id结果是表中id号大于100的数据中的头两行。再结合前面select top 1 id,name,pp,qq from test where id not in 能查到第三行的数据, 但是在mssql2005中,始终只返回表中id号为1的那一行。是不是在mssql2005中不能用not in作为排除条件来查询??应改是你表数据表问题不然微软也不用干了。
      

  10.   

    就是,好好检查一下,是那里的问题!BILL不可能干这么事情