表A: A_ID      A_datetime             A_UserID   按照日期降序排序,也就是说新添加的数据在前面
      6      2011-07-19 00:01:00        4
      5      2011-07-19 00:00:50        1
      4      2011-07-19 00:00:40        3
      3      2011-07-19 00:00:30        2
      2      2011-07-19 00:00:20        3
      1      2011-07-19 00:00:10        1
      ...........................(省略)
表B:  B_ID  A_UserID   key_id
       1       1          1
       2       2          1
       3       3          1
       ..........................(省略)想查出前2条数据,排序是按照表A,也就是日期降序排序
条件是A表的A.A_UserID=B.A_UserID我是这样使用:left join    select top 2 * from A t1 left join (select A_UserID from B where key_id=1) t2 on t1.A_UserID=t2.A_UserID结果是,前1000条有一些不是我想要的。left join的话    select top 2 * from A t1 right join (select A_UserID from B where key_id=1) t2 on t1.A_UserID=t2.A_UserID结果是:    A_datetime                A_UserID
        2011-07-19 00:00:50.000          1
        2011-07-19 00:00:10.000          1我最终想得到的是:
                  A_datetime           A_UserID
      5      2011-07-19 00:00:50        1
      4      2011-07-19 00:00:40        3这个该怎么整呢?用inner join好像也一样。PS:这两张表的数据量会非常非常大。

解决方案 »

  1.   

    这个明显是缺少日期排序条件,自然要用left join查询。
     
    加上order by A_datetime  desc。
      

  2.   

    select top 2 * from A inner join B on A.A_UserID=B.A_UserID and B.key_id=1
    order by A.A_datetime desc
      

  3.   


    因为我加上了top 条件 ,所以 left join的话,会出现一些不想要的数据。如果说把数据关联出来后再进行top,那效率会非常低下,因为数据量太大了。
      

  4.   


    这个写法可以实现,但是order by 的话,数据量大得可怕,基本数据库就崩了。
    一般对于大数据的话,我们是把想要的数据查询出来之后再进行order by的
      

  5.   

    你的做法有没有分析过执行计划呢?不要想当然的以为。
    即使有上亿条数据,在A_UserID A_datetime上建索引,这种简单的连接,应该也没问题,你试过吗?
      

  6.   


    批评得是,我可能想当然了。A_datetime上面我自然是建立了索引,刚写了另外一种方式。不知道效率如果。
    能否指教下?
    select top 2 * from A t1 where exists 
    (select 'X' from B t2 where t2.key_id=1 and t1.A_UserID=t2.A_UserID)
    执行计划我还不是很懂得看。最近在看书,但还没看到那一部分。- -!
      

  7.   

    exists相比inner join不是稳定的,
    不清楚你的t2有多少数据,用exists每扫描一行外表t1就会全表扫描一次t2,假如你的内表数据比外表少的多,那么这个效率还可以,如果很多,每次都扫描一次,你认为会快吗?这其中还不包括匹配度的问题。
      

  8.   


    t2表我也建立了索引,在key_id这一列上面,t1表跟t2表都是不可以预估,都是跟用户有关。数据量少的时候跟数据量大的时候执行计划是不一样的吧?
      

  9.   

    你这样吧,看看这个结果
    set statistics io on
    select top 2 * from A t1 where exists 
        (select 'X' from B t2 where t2.key_id=1 and t1.A_UserID=t2.A_UserID)
    set statistics io off
      

  10.   

    你自己少 order by 语句