2015-01-14 31 views
0

我知道这是可能的通过一些复杂的技术,我想知道任何最简单的方法来实现这个模式,每10行应该重复。 例如最简单的方法来重复在SQL中的每N行

 select a,b from tablename; (repeating 2 for example) 

会给

 a1,b1  
     a2,b2 
     a1,b1 
     a2.b2 
     a3,b3 
     a4,b4 
     a3,b3 
     a4,b4 

在那里,如果它是10它就会像

a1,b1 to a10,b10 again a1,b1 to a10,b10 

然后

a11,b11 to a20,b20 again a11,b11 to a20,b20 

+1

使您的预期输出清晰 – Exhausted

+0

您的输出行似乎以某种方式“交错”。这是内涵吗?无论如何,请记住,如果没有适当的'ORDER BY'子句,则应该将您的表视为_unordered set_。 –

+1

只需使用行发生器的笛卡尔联接。 –

回答

2

您希望重复两次十行的块。所以得到:

 
rows 1 to 10 
rows 1 to 10 
rows 11 to 20 
rows 11 to 20 
... 

为了获得行n折交叉连接与一个表中持有n记录。 (例如,通过查询足够大的表格并停止在第n行)。

您还需要原始记录的行号,因此您可以先获取块1,然后再获取块2等等。使用整数除法从行号获取块。

select t.a, t.b 
from (select a, b, row_number() over (order by a, b) as rn from tablename) t 
cross join (select rownum as repeatno from bigenoughtable where rownum <= 2) r 
order by trunc((t.rn -1)/10), r.repeatno, t.a, t.b; 
+0

对不起,我混淆了整数除法和模数。我纠正了我的答案。 –

+0

我明白了,谢谢 –

2

使用CTE和UNION ALL:

with rows as (
     select a, b 
     from tablename 
     where rownum <= 2 
    ) 
select * 
from rows 
union all 
select * 
from rows; 

只是一些警告了这一点。如果您需要表中的特定行,则应该使用order by。这很重要,因为同一个select可以返回不同的行集合。其实,考虑到这一点,更好的方法可能是:

with rows as (
     select a, b 
     from tablename 
     where rownum <= 2 
    ) 
select * 
from rows cross join 
    (select 1 as n from dual union all select 2 from dual) n; 
+0

这将只重复一次a1,a2,a1,a2 a1,a2,a1,a2,a3 ,a4,a3,a4型。 –

+0

,使得每n行重复两次 –

+0

@siddharthgupta。 。 。这就是你的问题所要求的。第二个查询清楚地概括为更多重复的组。 –

1

我宁可不要用UNION这么多次。我的方式是CONNECT BY ROWNUM <=N。其实是一个CARTESIAN JOIN。所以,基本上你需要一个ROW发电机笛卡尔与它一起,

更新

例如,这将重复10行的2倍 -

SQL> WITH t AS 
    2 (SELECT 'a1' A, 'b1' b FROM dual 
    3 UNION ALL 
    4 SELECT 'a2' a, 'b2' b FROM dual 
    5 UNION ALL 
    6 SELECT 'a3' a, 'b3' b FROM dual 
    7 UNION ALL 
    8 SELECT 'a4' A, 'b4' b FROM dual 
    9 UNION ALL 
10 SELECT 'a5' A, 'b5' b FROM dual 
11 UNION ALL 
12 SELECT 'a6' a, 'b6' b FROM dual 
13 UNION ALL 
14 SELECT 'a7' A, 'b7' b FROM dual 
15 UNION ALL 
16 SELECT 'a8' a, 'b8' b FROM dual 
17 UNION ALL 
18 SELECT 'a9' a, 'b9' b FROM dual 
19 UNION ALL 
20 SELECT 'a10' a, 'b10' b FROM dual 
21 ) 
22 SELECT A,B FROM t, 
23 (SELECT 1 FROM DUAL CONNECT BY ROWNUM <=2 
24 ) 
25 /

A B 
--- --- 
a1 b1 
a2 b2 
a3 b3 
a4 b4 
a5 b5 
a6 b6 
a7 b7 
a8 b8 
a9 b9 
a10 b10 
a1 b1 
a2 b2 
a3 b3 
a4 b4 
a5 b5 
a6 b6 
a7 b7 
a8 b8 
a9 b9 
a10 b10 

20 rows selected. 

SQL> 

因此,上述CONNECT BY ROWNUM <=10意味着重复行10次。如果您希望重复使用N次,请使用CONNECT BY ROWNUM <=N

+0

这会重复一次10行,我想要一组10行重复两次 –

+0

在我的例子中,只有2行,所以2行重复10次。所有你需要的是从你的表中有10行,并重复两次。查看我的更新。 –

+0

是啊,这是我想要的,但它应该继续像20行后a11,b11到a20,b20重复2次然后a21到a30再次重复2次。 –

相关问题