表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:这两张表的数据量会非常非常大。
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:这两张表的数据量会非常非常大。
解决方案 »
- js调用webservice的问题~~~~
- 值不能为空。参数名: path System.ArgumentNullException: 值不能为空。
- 求一个正则表达式(速度解决)
- 【GridView导出Excel报错!!!!!】 类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内。
- 这种图表如何来做?可以用水晶报表吗?
- 不用javascript能写出好的网站吗?因为以前没学过javascript,想只用asp.net和c#能否够用?
- dropdownlist数据绑定问题
- 问题多多,请高手指教
- 请教Response.AppendHeader方式下载文件时中文文件名乱码怎么解决
- wrox的答案
- 请大家看看我这个代码 该怎么修改。
- 获取系统当前时间中 年月日 中的 日 如何获取?
加上order by A_datetime desc。
order by A.A_datetime desc
因为我加上了top 条件 ,所以 left join的话,会出现一些不想要的数据。如果说把数据关联出来后再进行top,那效率会非常低下,因为数据量太大了。
这个写法可以实现,但是order by 的话,数据量大得可怕,基本数据库就崩了。
一般对于大数据的话,我们是把想要的数据查询出来之后再进行order by的
即使有上亿条数据,在A_UserID A_datetime上建索引,这种简单的连接,应该也没问题,你试过吗?
批评得是,我可能想当然了。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)
执行计划我还不是很懂得看。最近在看书,但还没看到那一部分。- -!
不清楚你的t2有多少数据,用exists每扫描一行外表t1就会全表扫描一次t2,假如你的内表数据比外表少的多,那么这个效率还可以,如果很多,每次都扫描一次,你认为会快吗?这其中还不包括匹配度的问题。
t2表我也建立了索引,在key_id这一列上面,t1表跟t2表都是不可以预估,都是跟用户有关。数据量少的时候跟数据量大的时候执行计划是不一样的吧?
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