A   类别表
AId    Aname
1     first
2     second
3     thirdB   所有的记录
BId     Bname      AId
01       value1    1
02       value2    1
03       value3    1
04       value4    2
05       value5    2
06       value6    2
07       value7    3
08       value8    3
09       value9    3
010      value10   3
011      value11   2
012      value12   2
013      value13   3
014      value14   3
015      value15   1需要得出的结果
Result
BId     Bname      AId
015      value15   1
03       value3    1
012      value12   2
011      value11   2
014      value14   3
013      value13   3得到这个结果用下面这条语句,已经有人帮忙写好了,可以实现,请帮我解释一下这条语句,其中 select top 2 bid from B where aid=a.aid order by 1 desc 是怎么得到6条记录的,为什么筛选条件为 aid=a.aid 就能把所有不同类别的最前面2个值纪录筛选出来,这一种有没有方法,有没有什么名字,是属于表的自身连接查询吗?select * from B as a
where bid in (select top 2 bid from B where aid=a.aid order by 1 desc )
order by 3

解决方案 »

  1.   

    select top 2 bid from B where aid=a.aid order by 1 desc 分组取前两位.组为三个,就是六条记录.如果组为四个,就是八条记录.记录数=2*组
      

  2.   

    呵呵,看来楼主还是不太明白!~:)
    只要弄清楚相关子查询的概念与要领,这个题不是很难的!--相关子查询与普通子查询的区别在于:相关子查询引用了外部查询中的列!这种用外部查询来限制子查询的方法使
    SQL查询变得更加强大和灵活。因为相关子查询能够引用外部查询,所以它们尤其适合编写复杂的where条件!
    相关子查询不能自己单独运行,其执行顺序如下:
    1.首先执行一次外部查询
    2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。
    3.使用子查询的结果来确定外部查询的结果集
      

  3.   

    select bid ,bname,aid from cyndi as a 
    where bid in (select top 2 bid from cyndi where aid=a.aid order by cast(bid as int) desc)
    order by 3,cast(bid as int) desc