2015-01-14 30 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次。 –

相關問題