2014-02-12 28 views
0

此請求是從複雜表中提取的。Oracle SQL:使用關聯表限制查詢中的行號

在這個例子中,我有兩個數據表:user_table,ref和一個關聯表:user_ref_asso。

架構和測試查詢當前位置:http://sqlfiddle.com/#!4/0a302/18

我嘗試使用「其中ROWNUM < X」,但它限制了總成績(用戶+ REF)限制USER_TABLE結果的數量。

我當前的查詢是:

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列上限制行號?

回答

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 Fiddle

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中你可以使用一些analtyical查詢計算返回的用戶數量和使用限制它的情況......

/編輯/以下是使用分析函數的查詢。不得不嘗試,因爲我不知道它的等級或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; 
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 

See Demo