2012-07-20 133 views
1

我具有以下數據集SQL查詢邏輯

 a  b  c 
     `1`  2  3 
     3  6  9 
     9  2  11 

正如你可以看到列的第一個值是固定的(即1),而是從第二排它拿起的列c的值之前的紀錄。

b欄的值是隨機的和列c的值被計算爲C = A + B

我需要編寫一個SQL查詢,這將在選擇上述格式此數據。我試着用滯後函數寫作,但無法實現。

請幫忙。

編輯:b存在於表只,a and c需要爲其計算基礎上的b值。

Hanumant

+0

你想在上面的格式來選擇數據或在格式插入。如果已經插入了簡單的select語句會給你結果 – Tassadaque 2012-07-20 12:32:52

+0

對不起,我的錯誤,結果應該如上選擇。只有b列存在a和c需要計算。 – hanumant 2012-07-20 12:34:41

+0

我現在看到你的編輯,並提出了什麼樣的順序你想要你的行被處理的問題? – 2012-07-20 12:41:16

回答

5
SQL> select a 
    2  , b 
    3  , c 
    4 from dual 
    5 model 
    6   dimension by (0 i) 
    7   measures (0 a, 0 b, 0 c) 
    8   rules iterate (5) 
    9   (a[iteration_number] = nvl(c[iteration_number-1],1) 
10   , b[iteration_number] = ceil(dbms_random.value(0,10)) 
11   , c[iteration_number] = a[iteration_number] + b[iteration_number] 
12  ) 
13 order by i 
14/

     A   B   C 
---------- ---------- ---------- 
     1   4   5 
     5   8   13 
     13   8   21 
     21   2   23 
     23   10   33 

5 rows selected. 

問候,
羅布。

+0

感謝您的回答! – hanumant 2012-07-20 13:26:32

0

不知道行之間的關係,我們如何計算前一行a and b列與當前行a column之和。我在表中創建了兩個column id and parent來查找兩行之間的關係。

parent是告訴我們關於previous row的列,而id是該行的primary key

create table test1 (a number ,b number ,c number ,id number ,parent number); 

Insert into TEST1 (A, B, C, ID) Values (1, 2, 3, 1); 
Insert into TEST1 (B, PARENT, ID) Values (6, 1, 2); 
Insert into TEST1 (B, PARENT, ID) Values (4, 2, 3); 

    WITH recursive (a, b, c,rn) AS 
    (SELECT a,b,c,id rn 
     FROM test1 
     WHERE parent IS NULL 
    UNION ALL 
    SELECT (rec.a+ rec.b) a 
      ,t1.b b 
      ,(rec.a+ rec.b+t1.b) c 
      ,t1.id rn 
     FROM recursive rec,test1 t1 
     WHERE t1.parent = rec.rn 
    ) 
    SELECT a,b,c 
     FROM recursive; 

output

  1. WITH keyword定義了名稱recursive針對要遵循

    遞歸(A,B,C,RN)

    AS

  2. 接着子查詢來到子命令的第一部分

    SELECT a,b,c,id rn FROM test1 WHERE parent IS NULL

命名的子查詢是兩個查詢UNION ALL。這是第一個查詢,它定義了遞歸的起點。就像在我的CONNECT BY查詢中一樣,我想知道記錄的起點是什麼。

接下來是這是最令人困惑的部分:

SELECT (rec.a+ rec.b) a 
      ,t1.b b 
      ,(rec.a+ rec.b+t1.b) c 
      ,t1.id rn 
    FROM recursive rec,test1 t1 
    WHERE t1.parent = rec.rn 

這是它如何工作的:

  • 通過查詢

    :1。父查詢執行:

    SELECT a,b,c FROM recursive;

    • 這觸發了名爲子查詢的執行。 2在子查詢的聯合執行的第一個查詢,給我們一個播種行與開始遞歸:

    SELECT a,b,c,id rn FROM test1 WHERE parent IS NULL

在這種情況下,種子行將是ID = 1有父一片空白。從這裏開始,我們將種子行稱爲「新結果」,從我們尚未完成處理的意義上來說,這是新的。

  • 子查詢的聯盟第二查詢執行:

    SELECT (rec.a+ rec.b) a ,t1.b b ,(rec.a+ rec.b+t1.b) c ,t1.id rn FROM recursive rec,test1 t1 WHERE t1.parent = rec.rn