2013-12-09 51 views
4

我是Oracle的新手,我試圖做一些不尋常的事情。鑑於此表和數據,我需要選擇每行,重複的對象,其中DupCount大於1Oracle重複行N次,其中N是列

create table TestTable 
(
    Name  VARCHAR(10), 
    DupCount NUMBER 
) 

INSERT INTO TestTable VALUES ('Jane', 1); 
INSERT INTO TestTable VALUES ('Mark', 2); 
INSERT INTO TestTable VALUES ('Steve', 1); 
INSERT INTO TestTable VALUES ('Jeff', 3); 

期望的結果:

Name  DupCount 
--------- ----------- 
Jane  1 
Mark  2 
Mark  2 
Steve  1 
Jeff  3 
Jeff  3 
Jeff  3 

如果通過一個單一的SELECT語句是不可能的任何有關存儲過程的幫助將不勝感激。

+1

什麼版本的Oracle?例如,@Hogan遞歸的CTE示例非常棒,但我相信它至少需要11.2 –

+0

我應該提到它是Oracle 10g。 – Mark

回答

6

您可以使用分層查詢做到這一點:

SQL Fiddle

查詢1

WITH levels AS (
    SELECT LEVEL AS lvl 
    FROM DUAL 
    CONNECT BY LEVEL <= (SELECT MAX(DupCount) FROM TestTable) 
) 
SELECT Name, 
     DupCount 
FROM TestTable 
     INNER JOIN 
     levels 
     ON (lvl <= DupCount) 
ORDER BY Name 

Results

| NAME | DUPCOUNT | 
|-------|----------| 
| Jane |  1 | 
| Jeff |  3 | 
| Jeff |  3 | 
| Jeff |  3 | 
| Mark |  2 | 
| Mark |  2 | 
| Steve |  1 | 
+0

完美的作品!謝謝。 – Mark

5

你可以用遞歸cte來做到這一點。它看起來像這樣

with cte as (name, dupcount, temp) 
(
    select name, 
      dupcount, 
      dupcount as temp 
    from testtable 
    union all 
    select name, 
      dupcount, 
      temp-1 as temp 
    from cte 
    where temp > 1 
) 
select name, 
     dupcount 
from cte 
order by name 
+0

你需要命名CTE列,否則你會得到一個錯誤 - 'WITH cte(name,dupcount,temp)AS' [SQLFIDDLE](http://sqlfiddle.com/#!4/2d21b/11) – MT0

+0

這看起來很棒並可能會很好,但我忘了提及我們在10克。謝謝。 – Mark

+0

@ MT0-感謝指針,名稱是在SQL Server中推斷的。 – Hogan