下面是表中SIZE列的数据
SIZE
1616  
192
1024
64
96
64
1504
288
224
96
416
128select top 10 size from sysaltfiles where size not in (select top 5 size from sysaltfiles)这句的执行出来的结果不明白是怎么来的,下面是执行出来的结果
1504
288
224
416
128
我感觉执行结果应该是
1504
288
224
所以不是很明白~~想请教一下

解决方案 »

  1.   

    你先执行select top 5 size from sysaltfiles
    size 
    ----------- 
    1616
    192
    1024
    64
    96这个意思是把前5位的size取出来了。
    之后的select top 10 size from sysaltfiles where size not in (select top 5 size from sysaltfiles)中的select top 10 size from sysaltfiles where size not in 
    要选的就是size不等于前面的选出来的5个值的10个size值,由于只剩下5个了,就选出了clo1        
    ----------- 
    1504
    288
    224
    416
    128
      

  2.   

    它是先从sysaltfiles 整个结果集中去筛选数据(where size not in (select top 5 size from sysaltfiles))
    , 然后再取top 10的
      

  3.   

    create table tb(SIZE int)
    insert into tb values(1616)
    insert into tb values(192)
    insert into tb values(1024)
    insert into tb values(64)
    insert into tb values(96)
    insert into tb values(64)
    insert into tb values(1504)
    insert into tb values(288)
    insert into tb values(224)
    insert into tb values(96)
    insert into tb values(416)
    insert into tb values(128)
    goselect top 10 size from tb where size not in (select top 5 size from tb)drop table tb/*
    size        
    ----------- 
    1504
    288
    224
    416
    128(所影响的行数为 5 行)
    */1 1616  
    2 192
    3 1024
    4 64
    5 96  --top 5取到这里
    6 64
    7 1504
    8 288
    9 224
    10 96 --top 10 取到这里(但64,96在top5中存在,所以往下取两个)
    11 416
    12 128
      

  4.   

    关键是执行顺序的问题,where语句是先执行的,过滤掉不满足条件的