안되서.. 지금 어떻게 할 까 고민중인데요..
혹시 먼저 이 문제에 도달해 보신분.. 있으시면 도움좀 ^^;;;
먼저,
현재 Altibase에서는 order siblings by 구문이 지원되지 않음을
말씀드립니다. 불편을 끼쳐 죄송합니다.
다만, 다음과 같이 workaround 방안을 제시해 드립니다.
오라클의 경우에도 order siblings by 구문은 9i버전부터 제공되어,
그 이전 버전에서는 stored procedure를 이용하여
간접적으로 그 구문을 구사하실 수 있습니다.
이와 동일하게 Altibase역시,
차후 해당 구문이 적용될 때까지는 Altibase의 stored procedure를 사용하여,
간접적으로 해당 구문을 구사하여야 할 것으로 보입니다.
방법은 다음과 같습니다.
1. 테이블 schema
( PARENT VARCHAR2(30) REFERENCES UNIVERSE,
NAME VARCHAR2(30) PRIMARY KEY );
2. record insert
INSERT INTO UNIVERSE VALUES ( NULL, 'WORLD' ) ;
INSERT INTO UNIVERSE VALUES ( 'WORLD', 'EUROPE' ) ;
INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'ENGLAND' ) ;
INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'THE NETHERLANDS' ) ;
INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'GERMANY' ) ;
INSERT INTO UNIVERSE VALUES ( 'WORLD', 'ASIA' ) ;
INSERT INTO UNIVERSE VALUES ( 'ASIA', 'JAPAN' ) ;
INSERT INTO UNIVERSE VALUES ( 'ASIA', 'CHINA' ) ;
INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AMERICA' ) ;
INSERT INTO UNIVERSE VALUES ( 'AMERICA', 'UNITED STATES' ) ;
INSERT INTO UNIVERSE VALUES ( 'AMERICA', 'MEXICO' ) ;
INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AFRICA' ) ;
INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'EGYPT' ) ;
INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'MOROCCO' ) ;
3. 위의 자료를 다음과 같이 보고자 하는 경우
WORLD
AFRICA
EGYPT
MOROCCO
AMERICA
MEXICO
UNITED STATES
ASIA
CHINA
JAPAN
EUROPE
ENGLAND
GERMANY
THE NETHERLANDS
가) 오라클 9i의 경우 아래 쿼리를 이용하시면 가능합니다.
SELECT SUBSTR( RPAD( ' ', LEVEL * 5) || NAME, 1, 40) "THE UNIVERSE"
FROM UNIVERSE
CONNECT BY PRIOR NAME = PARENT
START WITH PARENT IS NULL
ORDER SIBLINGS BY NAME;
나) Altibase 경우, 아래와 같이 stored function을 create하신 후,
그 function을 이용하면 가능합니다.
CREATE OR REPLACE FUNCTION UNIVERSESORTORDER( PKEY UNIVERSE.NAME%TYPE )
RETURN VARCHAR(100) IS
PATH VARCHAR(100);
BEGIN
PATH := PKEY;
-- INSERT ALL PREVIOUS PARENT RECORDS LIKE A DIRECTORY STRUCTURE
-- E.G. WORLD/EUROPE/...
DECLARE
CURSOR C1 IS SELECT PARENT FROM UNIVERSE START WITH NAME = PKEY CONNECT BY PRIOR PARENT = NAME ;
FOR CREC IN C1 LOOP
PATH := CREC.PARENT || '/' || PATH;
END LOOP;
END;
-- println('PATH '||PATH);
RETURN PATH;
/
ORDER BY UNIVERSESORTORDER( NAME ) ;
그러나, 위의 workaroun를 사용하실 때 주의하실 점이 있습니다.
대상이되는 레코드가 많을 경우,
ORDER BY UNIVERSESORTORDER( NAME ) 와 같은
order siblings by 대체 구문이 인덱스를 사용하지 못하고,
메모리에서 정렬이 됩니다.
따라서, 레코드 수가 많아 질 경우,
성능이 하락할 수 있으며, CPU Usage가 높아 질 수 있습니다.
이 점 유의하시어 사용하시면 고맙겠습니다.
그럼, 이만 줄이겠습니다.
좋은 하루되시요.
아 답변 정말 감사합니다.
미처 바쁜척하느냐고 방법고안도 못해보고 있었는데 정말 감사합니다.