建表語句:
這樣得到一組序列,是從1到5(即max(e-s)+1的值),這樣得到一個序列表,
通過這個表再與原表關聯,如下
顯然,結果不正確,即需要加where條件進行篩選
如下:
這樣即得到最終的結果。
CREATE TABLE t20(ID NUMBER(2),
s NUMBER(5),
e NUMBER(5));
INSERT INTO t20 VALUES(1,10,11);
INSERT INTO t20 VALUES(2,1,5);
INSERT INTO t20 VALUES(3,88,92);
COMMIT;
S爲號段起點,E爲號段終點,求出起點和終點之間的數(包括起點和終點)
思路:
首先需要用層次查詢構造連續的數(ROWNUM+號段之間的差值)
SELECT MAX(e-s)+1 FROM t20;可以找到首尾相差最大是多少,然後通過connect BY 構造一組序列,再通過簡單的加減法,就可以將要求的數字算出來。
那麼寫成
SELECT MAX(E - S) + 1 GAP FROM T20 CONNECT BY ROWNUM <= MAX(E - S) + 1;
這樣寫肯定不對,因爲connect BY 後面不允許使用分組函數,所以需要在外面再套一層查詢才行,
如下
SQL> SELECT ROWNUM DIS
2 FROM (SELECT MAX(E - S) + 1 GAP FROM T20)
3 CONNECT BY ROWNUM <= GAP;
DIS
----------
1
2
3
4
5
這樣得到一組序列,是從1到5(即max(e-s)+1的值),這樣得到一個序列表,
通過這個表再與原表關聯,如下
SQL> SELECT A.ID, A.S, A.E, B.DIS, A.S + B.DIS - 1 H
2 FROM T20 A,
3 (SELECT ROWNUM DIS
4 FROM (SELECT MAX(E - S) + 1 GAP FROM T20)
5 CONNECT BY ROWNUM <= GAP) B
6 ORDER BY A.ID, B.DIS;
ID S E DIS H
--- ------ ------ ---------- ----------
1 10 11 1 10
1 10 11 2 11
1 10 11 3 12
1 10 11 4 13
1 10 11 5 14
2 1 5 1 1
2 1 5 2 2
2 1 5 3 3
2 1 5 4 4
2 1 5 5 5
3 88 92 1 88
3 88 92 2 89
3 88 92 3 90
3 88 92 4 91
3 88 92 5 92
顯然,結果不正確,即需要加where條件進行篩選
如下:
SQL> SELECT A.ID, A.S, A.E, B.DIS, A.S + B.DIS - 1 H
2 FROM T20 A,
3 (SELECT ROWNUM DIS
4 FROM (SELECT MAX(E - S) + 1 GAP FROM T20)
5 CONNECT BY ROWNUM <= GAP) B
6 WHERE A.E >= A.S + B.DIS - 1
7 ORDER BY A.ID, B.DIS;
ID S E DIS H
--- ------ ------ ---------- ----------
1 10 11 1 10
1 10 11 2 11
2 1 5 1 1
2 1 5 2 2
2 1 5 3 3
2 1 5 4 4
2 1 5 5 5
3 88 92 1 88
3 88 92 2 89
3 88 92 3 90
3 88 92 4 91
3 88 92 5 92
這樣即得到最終的結果。