CREATE TABLE #b (
       [id] [char] (10),
       [name] [char] (10) 
)insert into #b(id,name) values('11','aaaa')  
insert into #b(id,name) values('11','bbbb')  
insert into #b(id,name) values('11','cccc')  
insert into #b(id,name) values('22','dddd')  
insert into #b(id,name) values('22','eeee')  
insert into #b(id,name) values('22','ffff')  select * from #b b where name=(select top 1 name from #b  where id=b.id)drop table #b结果是                     id          name
                                 11         aaaa
                                  22        dddd
如果我执行这句
select top 1 name from #b b where id=b.id       返回结果只有一个aaaa
那么select * from #b b where name='aaaa'就应该只有第一条记录啊为啥会是2条??

解决方案 »

  1.   

    select * from #b b where name=(select top 1 name from #b  where id=b.id)
    返回每个ID的第一条记录。select top 1 name from #b b where id=b.id
    因为有top 1,所以只返回一个aaaa,至于where id=b.id,这样写没意义,等于没写。select * from #b b where name='aaaa'
    我试了,就只返回了一条记录啊。
      

  2.   

    select top 1 name from #b b where id=b.id       返回结果只有一个aaaa

    TOP 1 了,所以只返回 1 条记录;那么select * from #b b where name='aaaa'就应该只有第一条记录啊为啥会是2条??

    这个不会的,前面的数据,只有一个符合条件的;建议你再测试一下;
      

  3.   

    同一ID时取第一条数据不加排序时,Name有索引同没索引结果集会有所不同,如:
    CREATE INDEX IX_#tb ON #b(ID,Name DESC);
    select * from #b b where name=(select top 1 name from #b  where id=b.id)
    /*id name
    11         cccc      
    22         ffff      */
    drop table #b
      

  4.   

    遍历 的是from 后面的表, from #b 就是遍历#b的所有记录啊
      

  5.   


    @zbdzjx select * from #b b where name=(select top 1 name from #b  where id=b.id)
    返回每个ID的第一条记录。我的意思就是为啥这句话是返回每个id的第一条记录,明明子语句的top 1只会返回一条name,
    那么前面的语句是where name=查询出来应该也只有一条啊
      

  6.   


    我的意思就是说子语句top 1 name只返回一条,那么为啥where name=(查询出的一个top1 name)会返回多条
      

  7.   

    select * from #b b where name=(select top 1 name from #b  where id=b.id)这个确实是返回 2 条记录的;但是,返回的是哪两 2 条记录,并不稳定;你可以参考一个 4# 大版的意见;=(select top 1 name from #b  where id=b.id)前面的  id 是指本表中的 id , 而  b.id 是指外层的 id ; 显然,当 b.id = 11 时,在子查询中,要查出一个数值来,而外层只能有记录可以匹配上,
    b.id 共可以取两个值,一个是 11 一个是 22 ,所以取出来了两条;
    如果insert into #b(id,name) values('11','aaaa') 这条语句,执行两次,那么,这个查询的结果, 可能会是 2 条,也可能是 3 条; 也就是说的不稳定;