Использование Oracle 10.2.0.
У меня есть таблица, состоящая из номера строки, уровня отступа и текста. Мне нужно написать процедуру для «естественной» сортировки текста на уровне отступа [это дочерний элемент более низкого уровня отступа]. У меня ограниченный опыт работы с аналитическими процедурами и соединениями до / ранее, но из того, что я читал здесь и в других местах, кажется, что они могут быть использованы, чтобы помочь моему делу, но я не могу понять, как.
CREATE TABLE t (ord NUMBER(5), indent NUMBER(3), text VARCHAR2(254));
INSERT INTO t (ord, indent, text) VALUES (10, 0, 'A');
INSERT INTO t (ord, indent, text) VALUES (20, 1, 'B');
INSERT INTO t (ord, indent, text) VALUES (30, 1, 'C');
INSERT INTO t (ord, indent, text) VALUES (40, 2, 'D');
INSERT INTO t (ord, indent, text) VALUES (50, 2, 'Z');
INSERT INTO t (ord, indent, text) VALUES (60, 2, 'E');
INSERT INTO t (ord, indent, text) VALUES (70, 1, 'F');
INSERT INTO t (ord, indent, text) VALUES (80, 2, 'H');
INSERT INTO t (ord, indent, text) VALUES (90, 2, 'G');
INSERT INTO t (ord, indent, text) VALUES (100, 3, 'J');
INSERT INTO t (ord, indent, text) VALUES (110, 3, 'H');
Это:
SELECT ord, indent, LPAD(' ', indent, ' ') || text txt FROM t;
... возвращается:
ORD INDENT TXT
---------- ---------- ----------------------------------------------
10 0 A
20 1 B
30 1 C
40 2 D
50 2 Z
60 2 E
70 1 F
80 2 H
90 2 G
100 3 J
110 3 H
11 выбранных строк.
В случае, который я для вас определил, мне нужно, чтобы моя процедура установила ORD 60 = 50 и ORD 50 = 60 [перевернуть их], потому что E - после D и перед Z.
То же самое с ORD 80 и 90 [с 90, приносящими 100 и 110 с ним, потому что они принадлежат ему], 100 и 110. Окончательный результат должен быть:
ORD INDENT TXT
10 0 A
20 1 B
30 1 C
40 2 D
50 2 E
60 2 Z
70 1 F
80 2 G
90 3 H
100 3 J
110 2 H
В результате каждый уровень отступа сортируется в алфавитном порядке, в пределах его уровня отступа, в пределах уровня родительского отступа.