使用Oracle 10.2.0。Oracle - 多級自然排序行
我有一個由行號,縮進級別和文本組成的表格。我需要編寫一個例程來'自然'對縮進級別內的文本進行排序[這是縮進級別較低的子節點]。我在分析例程方面經驗有限,並且通過/之前進行連接,但是從我在這裏和其他地方閱讀的內容看來,似乎可以用它們來幫助我的事業,但我無法弄清楚。
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
其結果是,每個縮進級別按字母順序排序,在其縮進級別內,在縮進級別內。
聽起來像是給我的家庭作業。 – Gandalf 2009-10-27 20:29:36
似乎很難做家庭作業,但誰知道? – Lucero 2009-10-27 20:33:49
它不是一項家庭作業。我已經極大地簡化了表格和數據,專注於答案,而不是無關的數據。 – user55904 2009-10-27 20:48:23