2016-11-13 49 views
0

假設你有一個這樣的表:重複行加入

+----+--------+-------------+----------------+--------+ 
| Id | Parent | Description | NumberOfThings | Number | 
+----+--------+-------------+----------------+--------+ 
| A | NULL | This is A |    1 | NULL | 
| B | NULL | This is B |    3 | NULL | 
| C | NULL | This is C |    2 | NULL | 
+----+--------+-------------+----------------+--------+ 

,並要使用NumberOfThings到X生孩子的事情號:

+-----+--------+-------------+----------------+--------+ 
| Id | Parent | Description | NumberOfThings | Number | 
+-----+--------+-------------+----------------+--------+ 
| A | NULL | This is A |    1 | NULL | 
| B | NULL | This is B |    3 | NULL | 
| C | NULL | This is C |    2 | NULL | 
| A-1 | A  | This is A |    1 | 1  | 
| B-1 | B  | This is B |    1 | 1  | 
| C-1 | C  | This is C |    1 | 1  | 
| B-2 | B  | This is B |    1 | 2  | 
| C-2 | C  | This is C |    1 | 2  | 
| B-3 | B  | This is B |    1 | 3  | 
+-----+--------+-------------+----------------+--------+ 

我怎麼會去這樣做?我有一個想法,我可以使用LEFT JOIN,也許可以使用某種通配符ON子句,但我不確定從哪裏開始。

這是使用SQL Server 2012,但我相信可以有一個解決方案不是特定於任何數據庫引擎。

SQL撥弄第一次嘗試:http://sqlfiddle.com/#!6/dcafc/2

+2

您需要加入到某種類型的Numbers表中,其中聯接與Numbers表中的每個記錄匹配<='NumberOfThings'列。這將有助於:http://stackoverflow.com/questions/1393951/what-is-the-best-way-to-create-and-populate-a-numbers-table –

回答

0

這是一個有點亂,但遞歸CTE可以這樣做:

with cte as (
    select Id as BaseId, 
     cast(Id as varchar(10)) as Id, 
     cast(null as varchar(1)) as Parent, 
     Description, 
     NumberOfThings, 
     NumberOfThings as TotalCount, 
     1 as CurrentCount, 
     null as Number 
    from NumThings 
    union all 
    select c.BaseId, 
     cast(c.BaseId + '-' + cast(c.CurrentCount as varchar(8)) as varchar(10)) as Id, 
     c.BaseId as Parent, 
     c.Description, 
     1 as NumberOfThings, 
     c.TotalCount, 
     c.CurrentCount + 1 as CurrentCount, 
     c.CurrentCount as Number 
    from cte c 
    where c.CurrentCount <= c.TotalCount 
) 
select Id, 
     Parent, 
     Description, 
     NumberOfThings, 
     Number 
    from cte 
order by case when Parent is null then 0 else 1 end, 
      Number, 
      Id; 

Demo

0

好像你正在尋找一套工會加上一套與自身的交叉乘積。雖然,我不確定這是否正確,因爲NumberOfThings列的結果是理想的。

SELECT 
    [Id] 
    , [Parent] 
    , [NumberOfThings] 
FROM 
    [dbo].[NumThings] 
UNION ALL 
SELECT 
    A.[Id] + '-' + CAST(B.NumberOfThings AS VARCHAR(50)) 
    , B.[Id] As Parent 
    , A.[NumberOfThings] 
FROM 
    [dbo].[NumThings] A 
    , [dbo].[NumThings] B 
GO 
+0

這不完全是我想要的:http:/ /sqlfiddle.com/#!6/dcafc/2正如你所看到的,它創造了3個孩子A,當它需要的時候,只有1個 – ParoX

0

這裏.....我相信這是你正在尋找的結果是:

 SELECT 
     [Id] 
      , [Parent] 
      , [NumberOfThings] 
     FROM 
[dbo].[NumThings] 
     UNION ALL 
    SELECT 
      A.[Id] + '-' + CAST(B.NumberOfThings AS VARCHAR(50)) 
      , A.[Id] As Parent 
     , B.[NumberOfThings] 
    FROM 
     [dbo].[NumThings] A 
    LEFT JOIN [dbo].[NumThings] B 
     ON B.NumberOfThings BETWEEN 1 AND A.NumberOfThings 
    GO 
+0

不錯。不幸的是,例如,如果您將其中一行中的「NumberOfThings」的值更改爲「10」,則不起作用。 – sstan

+0

我的誤解,因爲我認爲「NumberOfThings」是一些與你的表中的「東西」的泰格數有關....即。 10件事情需要A-J ......如果情況並非如此,那麼我不相信交叉連接表真的有用 – user3289372