大家帮忙理解一条SQL语句(提取每个用户用户的前N条数据)

oldmoon 2009-04-02 01:53:55
今天找资料,看到一条语句:
目的:把每个用户的前100条记录提取出来
语句:
select t.* from A t where iDataId in(select top 100 iDataId from A where iPersonId=t.iPersonId order by dUseTime)

效果达到了,但不知道所以然,请各位兄弟帮忙理解一下;

引用地址:
http://topic.csdn.net/u/20090217/16/d2e90f06-7f90-4e16-afe4-7458f5947efe.html
...全文
486 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
atls 2010-08-08
  • 打赏
  • 举报
回复
这样数据量大的情况下,效率会很低啊,有没有更好的办法呢
haidexuanshi 2009-04-03
  • 打赏
  • 举报
回复
除了这样达到效果,还可以怎么写? 要求一条SQL解决
yibey84 2009-04-03
  • 打赏
  • 举报
回复
这里理解下SELECT 查询原理,这个语句分2层查询,外层和内层。它执行的时候先读取一条外层的记录,通过这个条记录获得iDataId, iPersonId ;然后再判断内层查询,即这个iDataId是不是在iPersonId的值为外层记录的iPersonId 前100条记录。
oldmoon 2009-04-03
  • 打赏
  • 举报
回复
明白了,谢谢WEL04
WEL04 2009-04-02
  • 打赏
  • 举报
回复
1.select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name

2.select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)

3.select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name,a.val
/*--按name分组取最小的两个(N个)val


多看看这样的写法就能明白了
WEL04 2009-04-02
  • 打赏
  • 举报
回复
嵌套循环

类似

for(i=1;i<10;i++)
{
for (y=1;y<10;y+)
...........
}


--iDataId 必须为唯一值,如果不唯一的话将达不到效果????/既是相同也没关系啊

where iDataId in (1,1) 和where iDataId in (1) 有什么区别吗?
oldmoon 2009-04-02
  • 打赏
  • 举报
回复
但是如何确定每个用户的100条数据呢?好像这个也不是笛卡尔积数据
lgx0914 2009-04-02
  • 打赏
  • 举报
回复
因为有iPersonId=t.iPersonId这个限制[Quote=引用 5 楼 oldmoon 的回复:]
引用 1 楼 sdhdy 的回复:
SQL code按dUseTime排序,取每个人前100条iDataId。


这个我知道,我想请问,为什么一个表这样联合查询就能得到条个用户的前N条,而不用group by之类的
[/Quote]
oldmoon 2009-04-02
  • 打赏
  • 举报
回复
前面各位兄弟回答都正确,但是好象还差更深层的意思
比如说:

为什么内层的select top 100 iDataId
from A
where iPersonId=t.iPersonId
order by dUseTime

这个TOP 100 一定能确定那个iDataId人集合是每个用户100条呢?
oldmoon 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sdhdy 的回复:]
SQL code按dUseTime排序,取每个人前100条iDataId。
[/Quote]

这个我知道,我想请问,为什么一个表这样联合查询就能得到条个用户的前N条,而不用group by之类的
yygyogfny 2009-04-02
  • 打赏
  • 举报
回复
子查询将某个用户的100条记录查询出来,

外层查询将所有用户,除子查询里100条记录以外的,排除.
mugua604 2009-04-02
  • 打赏
  • 举报
回复

select t.*
from A t
where iDataId in(
select top 100 iDataId
from A
where iPersonId=t.iPersonId
order by dUseTime)
---iDataId 必须为唯一值,如果不唯一的话将达不到效果
/*
select top 100 iDataId
from A
where iPersonId=t.iPersonId --把t.iPersonId 改为你想要的字符串 你就能理解了!
order by dUseTime
*/
csdyyr 2009-04-02
  • 打赏
  • 举报
回复
--子查询为前一百条记录
where iDataId in(select top 100 iDataId from A where iPersonId=t.iPersonId order by dUseTime
sdhdy 2009-04-02
  • 打赏
  • 举报
回复
按dUseTime排序,取每个人前100条iDataId。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧