根據號段求出包含的數(讀書筆記二)

建表語句:
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

這樣即得到最終的結果。
發佈了50 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章