此请求是从复杂的请求中提取的。
在这个例子中,我有两个数据表:user_table,ref和一个关联表:user_ref_asso。
架构和测试查询位于:http://sqlfiddle.com/#!4/0a302/18
我尝试使用“where rownum< X”限制USER_TABLE结果的数量,但它限制了总结果(user + ref)。
我目前的查询是:
select * from
(SELECT u.user_id, r.ref_id, u.name, r.ref
FROM user_table u
INNER JOIN user_ref_asso ur
ON ur.user_id = u.user_id
INNER JOIN REF r
ON r.ref_id = ur.ref_id
order by u.user_id, r.ref_id)
WHERE rownum <= 2;
例如,如果没有行限制的结果是:
USER REF
1 1
1 2
2 1
2 2
3 1
3 2
如果我将行号限制设置为2,则预期结果将是(2个不同的用户):
USER REF
1 1
1 2
2 1
2 2
但在我的情况下,结果是(2结果):
USER REF
1 1
1 2
如何限制不同user_id列上的行号?
答案 0 :(得分:1)
使用分析功能实现此目的:
select user_id, ref_id, name, ref from
(SELECT u.user_id, r.ref_id, u.name, r.ref, dense_rank() over (order by u.user_id) rn
FROM user_table u
INNER JOIN user_ref_asso ur
ON ur.user_id = u.user_id
INNER JOIN REF r
ON r.ref_id = ur.ref_id
order by u.user_id, r.ref_id)
WHERE rn <= 2;
输出:
| USER_ID | REF_ID | NAME | REF | RN |
|---------|--------|-------|------|----|
| 1 | 1 | Name1 | Ref1 | 1 |
| 1 | 2 | Name1 | Ref2 | 1 |
| 2 | 1 | Name2 | Ref1 | 2 |
| 2 | 2 | Name2 | Ref2 | 2 |
答案 1 :(得分:0)
最简单的解决方案,但不是很好:)是:
select * from
(SELECT u.user_id, r.ref_id, u.name, r.ref
FROM (select * from user_table WHERE rownum <= 2) u
INNER JOIN user_ref_asso ur
ON ur.user_id = u.user_id
INNER JOIN REF r
ON r.ref_id = ur.ref_id
order by u.user_id, r.ref_id);
或者在oracle的情况下,你可以使用一些分析性查询来计算返回用户的数量并使用它来限制它...
/ 编辑 / 以下是使用分析函数的查询。不得不尝试,因为我不确定它的RANK或DENSE_RANK:)
select * from
(SELECT u.user_id, r.ref_id, u.name, r.ref, dense_rank() over (order by u.user_id) cnt
FROM user_table u
INNER JOIN user_ref_asso ur
ON ur.user_id = u.user_id
INNER JOIN REF r
ON r.ref_id = ur.ref_id
order by u.user_id, r.ref_id)
WHERE cnt <= 2;
答案 2 :(得分:0)
with cte as
(
SELECT u.user_id, r.ref_id, u.name, r.ref,rank()over(partition by r.ref_id order by u.user_id ) as rn
FROM user_table u
INNER JOIN user_ref_asso ur
ON ur.user_id = u.user_id
INNER JOIN REF r
ON r.ref_id = ur.ref_id
order by u.user_id, r.ref_id
)
select * from cte where rn<=2