2017-03-10 1 views
0

이번에는 계층 테이블에 대한 페이징 쿼리 문제가 있습니다.페이징 계층 쿼리에 대한 Oracle_ROW_NUMBER

table_name (id varchar2 (50), id_parent varchar2 (50));

그래서 샘플 데이터에 대해 내가 가진 :

WITH table_name AS 
(
    SELECT '3' id, '' id_parent FROM DUAL UNION ALL 
    SELECT '5' id, '3' id_parent FROM DUAL UNION ALL 
    SELECT 's' id, '3' id_parent FROM DUAL UNION ALL 
    SELECT '4' id, 'as' id_parent FROM DUAL UNION ALL 
    SELECT 'aa' id, 'as' id_parent FROM DUAL UNION ALL 
    SELECT 'as' id, '3' id_parent FROM DUAL UNION ALL 
    SELECT 'ad' id, '3' id_parent FROM DUAL UNION ALL 
    SELECT '2' id, '' id_parent FROM DUAL 
) 
SELECT LPAD('-', 2 * (level - 1), '-') || id AS id1, 
    id_parent, 
    rownum --Seem not legit here 
FROM table_name 
START WITH id_parent IS NULL 
CONNECT BY PRIOR id = id_parent 
--ORDER SIBLINGS BY id 
; 

이 예상되는 출력 :

id   id_parent rownum 
2      1 
3      2 
--5   3   3 
--ad  3   4 
--as  3   5 
----4  as   6 
----aa  as   7 
--s   3   8 

을 지금은 ROW_NUMBER 페이징을위한 ROWNUM에 의지하십시오. 오라클 계층 쿼리의 의사로서, 이것은 선주문 Traveral을 우리가 원하는대로 표시 할 수 있는지 확인합니다. 그러나 일반적으로 SQL과 마찬가지로 IMO는 동일한 레벨 노드가 정렬 될 것임을 보장하지 않습니다.).

그래서 ROW_NUMBER() OVER (ORDER SIBLINGS BY id)과 같은 것이 필요합니다. 하지만 나는 그런 것을 찾기 위해 운이 없다.

이 작업을 수행 할 수있는 방법이 있습니까?

답변

1

주문 먼저 다음 ROWNUM 이후 하위 쿼리를 사용하여 생성 : 당신은 실행 쿼리에서 발생하는 순서와 외부 쿼리가 필요

SELECT t.*, 
     ROWNUM 
FROM (
    SELECT LPAD('-', 2 * (level - 1), '-') || id AS id1, 
     id_parent 
    FROM table_name 
    START WITH id_parent IS NULL 
    CONNECT BY PRIOR id = id_parent 
    ORDER SIBLINGS BY id 
) t; 

입니다 :

  • 행을 선택됨;
  • 이어서 WHERE 절 필터가 적용된다 (그리고 ROWNUM 의사 컬럼 모든 WHERE 절 필터와 일치하는 각 행에 대해 생성된다 -이 경우이므로 모든 행 번호 되리라는 WHERE 절가 없다);
  • 그런 다음 ORDER BY 절이 적용됩니다.

단일 쿼리에서이 값을 적용하면 데이터베이스에서 찾은 행을 얻고 행 번호를 부여한 다음 원하는 행을 순서대로 정렬 할 수 있습니다. 내부 쿼리를 사용하면 ORDER BY 절을 먼저 적용한 다음 행 번호가 생성되어 이후에 외부 쿼리를 실행할 수 있습니다.

+0

arr, 감사합니다. MTO, 'rownum'에 대한 내 지식이 부족합니다. 답변을 읽은 후 필자는이 유용한 링크를 검색하여 발견했습니다 [Top-n 및 페이지 매기기 쿼리] (http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html)) (비록 내가 asktom "__"어딘가에서 한 번 읽었지만, –