2015-06-23 59 views
0

考慮以下情形:如何使用MySQL中的列值爲表中的每個記錄生成多個記錄?

Area Code Count 
BP  90-99 10 
CL  78-87 10 

我需要爲這兩個產生十個記錄。

Area Code 
BP  90 
BP  91 
BP  92 
BP  93 
BP  94 
BP  95 
BP  96 
BP  97 
BP  98 and so on. 

在oracle中,這可以很容易地通過使用connect級別來完成。如何使用MySQL來做到這一點。請注意,我確實在第三列count中進行了迭代次數。

回答

1

您需要有一個數字表。這可以作爲即時派生表產生:

select area, 
     (substring_index(code, '-', 1) + n.n - 1) as code 
from (select 1 as n union all select 2 union all select 3 union all 
     select 4 union all select 5 union all select 6 union all select 7 union all 
     select 8 union all select 9 union all select 10 
    ) n join 
    scenario s 
    on n.n <= s.count; 

你需要確保數字的列表是表中的最大數不夠大。如果你有一個可用的數字表,這很方便。通常,auto_increment列可以幫助生成這樣的表。

+0

這是一個非常優雅的解決方案,你已經提供。我有很多需要了解MySQL的知識。 – MontyPython

0

使用數字表,並嘗試這種方法

Create table numbers(number int) 
insert into numbers(number) 
select 1 union all 
select 2 union all 
. 
. 
. 
select 100 

select t1.area, left(code,locate('-',code)-1)*1 from table as t1 
inner join numbers as t2 on 1=1 
where left(code,locate('-',code)-1)*1 +number 
<=substring(code,locate('-',code)+1,length(code))*1 
+0

檢查上述解決方案。它很美。 – MontyPython

0

就像一個想法,你可以簡單地使用此代碼:

CREATE TABLE #tab (area nchar(2), code nvarchar(10), count int) 

INSERT INTO #tab(area, code, count) 
VALUES(N'BP',N'90-99', 10),(N'CL',N'78-87',10) 

SELECT * 
FROM #tab t 
OUTER APPLY (
     SELECT TOP(t.count) ROW_NUMBER() OVER(ORDER BY object_id) + CONVERT(int,SUBSTRING(t.code,1,PATINDEX(N'%-%',t.code)-1)) as nr 
     FROM sys.all_objects 
    ) as oa 

DROP TABLE #tab 

在這種情況下我使用sys.all_objects只是爲了得到一個表數字一切。你可以使用你所有的其他表格。即使#tab本身,如果它足夠大,有足夠的行。另一種解決方案是使用CTE表達式來生成那些所需的行。 :-)

+0

這個問題被標記爲「mysql」,這種語法不被MySQL支持。 –

+0

啊好的。沒有看到它。我看過SQL-Server標籤。也許標籤之後被移除/更改?無論如何,如果有人稍後需要解決他自己的問題,我會離開它。 – Ionic

+0

@Ionic - 不用擔心朋友。也將檢查此爲SQL Server也。 – MontyPython

相關問題