2012-12-12 56 views
2

我有以下查詢:添加行輸出

SELECT 
    ROW_NUMBER() OVER (PARTITION BY a.jpnum, a.jptask 
         ORDER BY a.jpnum, a.jptask) rn, 
    a.jpnum, 
    a.jptask, 
    REGEXP_SUBSTR (a.description, '[^,]+', 1, 3) col_3, 
    REGEXP_REPLACE (REGEXP_SUBSTR (a.description, 
           '[^,]+', 1, 3), 'C-.*') mytest 
FROM My.task a 
WHERE a.jpnum = '13788'; 

輸出是:

RN JPNUM JPTASK COL_3  MYTEST 
1  13788 10   7C-4E SIG 7 
1  13788 20   9C-6E SIG 9 

到目前爲止好......但這裏是我卡上。我需要重複每次重複的次數與MY TEST中的次數一樣多。所以......以前兩個例子爲例。我需要得到:

RN JPNUM JPTASK COL_3 MYTEST 
--------------------------------------- 
1 13788 10 7C-4E SIG 7 
2 13788 10 7C-4E SIG 7 
3 13788 10 7C-4E SIG 7 
4 13788 10 7C-4E SIG 7 
5 13788 10 7C-4E SIG 7 
6 13788 10 7C-4E SIG 7 
7 13788 10 7C-4E SIG 7 
1 13788 20 9C-6E SIG 9 
2 13788 20 9C-6E SIG 9 
3 13788 20 9C-6E SIG 9 
4 13788 20 9C-6E SIG 9 
5 13788 20 9C-6E SIG 9 
6 13788 20 9C-6E SIG 9 
7 13788 20 9C-6E SIG 9 
8 13788 20 9C-6E SIG 9 
9 13788 20 9C-6E SIG 9 

我有數百個這樣的運行,並MYTEST可能會高達300

+1

您使用的是什麼數據庫引擎? –

+0

SQL只是結構化查詢語言 - **許多**數據庫系統使用的語言。知道你正在使用哪個數據庫系統**(以及哪個版本)會有所幫助...... –

+0

你的權利......對不起。Oracle SQL與10G Woking(我相信) –

回答

0

解決這個問題的基本方法是:

  1. 生成包含表一個數字序列至少與您想要的最大重複次數一樣高。
  2. 加入到序列表中的序列表中,其中序列表中的序號是< =您想要重複的序列(在本例中爲MYTEST)。

確切的實施取決於您使用的數據庫,但this question包含所有解決方案。

0

所有你需要的是一個數字列表最多300做一個查詢。下面是一個示例:

SELECT ROW_NUMBER() OVER (PARTITION BY a.jpnum, a.jptask 
          ORDER BY a.jpnum, a.jptask) rn, 
     jpnum, jptask, col_3, mytest 
from (select a.jpnum, a.jptask, 
      REGEXP_SUBSTR (a.description, '[^,]+', 1, 3) col_3, 
      REGEXP_REPLACE (REGEXP_SUBSTR (a.description, 
          '[^,]+', 1, 3), 'C-.*') mytest 
     FROM My.task a 
     WHERE a.jpnum = '13788' 
    ) t join 
    (select row_number() over (order by column_name) as num 
    from Information_Schema.Columns 
    ) numbers 
    on numbers.num <= cast(mytest as int) 

可以將任何表放入至少有300行的第二個子查詢中。根據數據庫的不同,還有其他方式可以表達此查詢,但方法通常是相同的:連接到數字表以獲取附加行。

+0

GORDON! !!!!!!!!!!!謝謝,像魅力一樣工作。 –