将行添加到输出

时间:2012-12-12 14:39:16

标签: sql

我有以下查询:

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

2 个答案:

答案 0 :(得分:0)

解决这个问题的基本方法是:

  1. 生成一个表,其中包含的数字序列至少与所需的最大重复次数一样高。
  2. 加入序列表,其中序列表中的数字是< =您要重复的事物(在本例中为MYTEST)。
  3. 确切的实现取决于您使用的数据库,但this question具有所有解决方案。

答案 1 :(得分: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行的第二个子查询中。根据数据库的不同,还有其他方法可以表达此查询,但方法通常是相同的:连接到数字表以获取其他行。