0

这个请求是从一个复杂的请求中提取的。

在此示例中,我有两个数据表: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 列上的行数?

4

3 回答 3

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 |

sql小提琴

于 2014-02-12T11:33:22.140 回答
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 的情况下,您可以使用一些分析查询来计算返回用户的数量并使用它来限制它......

/ edit /这里是使用解析函数的查询。不得不尝试一下,因为我不确定它是 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;
于 2014-02-12T11:32:07.497 回答
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

看演示

于 2014-02-12T11:38:04.567 回答