SQL 分组查询中子查询的问题

SELECT B.* FROM dbo.userTb A INNER JOIN dbo.AuctionSell b ON A.UserId = b.CreateUid
WHERE ( SELECT COUNT(1) FROM dbo.AuctionSell n WHERE n.CreateUid = a.UserId AND n.ASID <= b.ASID ) <= 3 order by a.userid
上面的语句是查询 每个Userid 前三条数据,与使用 orver partition by 的查询结果一样,但是本人不明白上面语句查询中 AND n.ASID <= b.ASID 的意思,为什么去掉这句结果就不一样啦,求大牛详解
ASID 是dbo.AuctionSell的主键

SELECT COUNT(1) FROM dbo.AuctionSell n WHERE n.CreateUid=a.UserId AND n.ASID<=b.ASID

这句是获取n中CreateUid=a.UserId,且ASID小于b.ASID的记录条数。注意到n和b都是dbo.AuctionSell,因此这个子查询实际上是获取按ASID排序的序号。例如ASID最小的那条记录,只有一条记录(就是自己)的ASID小于等于它,所以子查询结果是1。而第10小的记录,一共有10条记录(包括自己)的ASID小于等于它,所以子查询结果是10。

 

这种写法是row_number()的一种替代写法,适用于不支持row_number()的场合

追问

谢谢回复, 不过还是不太明白AND n.ASID <= b.ASID 的意思,,可否再详细点,或举个小例子

追答

假如tmp表中数据如下:

查询语句是:

select a.id,a.name,
(select count(b.id) from tmp b where a.name=b.name and b.id<=a.id) seq 
from tmp a

那么对于第一行数据,子查询变为:

select count(b.id) from tmp b where b.name='a' and b.id<=1

其结果为1。同理,对第二、三行数据,子查询变为:

select count(b.id) from tmp b where b.name='b' and b.id<=2
select count(b.id) from tmp b where b.name='a' and b.id<=3

其结果分别为1和2。

因此最后的查询结果为:

这跟:

select id,name,
row_number() over (partition by name order by id) seq 
from tmp

的结果是一样的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-09
AND n.ASID <= b.ASID

当表与自身连接时,为了去掉重复,就会这样做。
相似回答