2017-06-03 65 views
0

我需要將父列中的父子記錄放入其他具有該ID的表中。和 我嘗試這樣做:如何在sql中的一列插入父和子記錄?

select parent.Parent,child1.child1,Child2.child2 
from parent 
join Child1 on child1.ParentIdId=parent.ParentID 
join Child2 on child1.child1Id=child2.child1Id` 

Create table parent (ParentID int, Parent varchar(10)) 

Create table Child1 (child1Id int, child1 varchar(10), ParentIdId int) 
Create table Child2 (child2Id int, child2 varchar(10), child1Id int) 


insert into parent values(10,'Sony'),(20,'Apple'),(30,'HTC'),(40,'Nexus') 
insert into Child1 values(100,'Sony1',10),(200,'Sony2',10),(300,'Apple1',20),(400,'Apple2',20),(500,'HTC1',30),(600,'HTC2',30), 
(700,'Nexus1',40),(800,'Nexus2',40) 

insert into Child2 values(1000,'Sony11',100),(2000,'Sony22',100),(3000,'Apple11',200),(4000,'Apple22',200),(5000,'HTC11',300),(6000,'HTC22',300), 
(7000,'Nexus11',400),(8000,'Nexus22',400) 

輸出我需要:

Ids Products Parents 
10 Sony  null 
20 Apple  null 
30 HTC   null 
40 Nexus  null 
100 Sony1  10 
200 Sony2  10 
300 Apple1  20 
400 Apple2  20 
500 HTC1  30 
600 HTC2  30 
700 Nexus2  40 
800 Nexus2  40 
1000 Sony11 100 
2000 Sony22 100 
3000 Apple11 200 
4000 Apple22 200 
5000 HTC11 300 
6000 HTC22 300 
7000 Nexus11 400 
8000 Nexus22 400 

回答

1

你可能不得不這樣做在3個不同的選擇查詢像下面

SELECT ParentIds as Ids, 
     Parent as Products, 
     CAST(NULL AS INT) AS Parent 
INTO #Product 
FROM Parent 
UNION ALL 
SELECT child1.child1id, 
     Child1.child1, 
     Child1.ParentId 
FROM parent 
INNER JOIN Child1 on child1.ParentIdId=parent.ParentID 
UNION ALL 
SELECT Child2.Child2Id,child2.child2,Child2.child1Id 
FROM parent 
INNER JOIN Child1 on child1.ParentIdId=parent.ParentID 
INNER JOIN Child2 on child1.child1Id=child2.child1Id` 
+0

謝謝您的回答@saj ..如果可能的話沒有 'UNION ALL' 選項 – Meline

1

我覺得你的例子簡單工會都足夠了,但我認爲你正在尋找遞歸cte如下:

;with cte (Child, nam, parent) as 
(
    select * from child2 
    union all 
    select * from child1 
    union all 
    select *, null as Parent from parent 
) 
, cte2 as 
(
    select *, 0 as Levl from cte where parent is null 

    union all 

    select c1.*, c2.Levl + 1 as Levl from cte2 c2 join cte c1 
     on c2.child = c1.parent 
) 
select * from cte2 
order by levl 

我已經加入LEVL只是爲了瞭解層次

+0

感謝@卡納安。 。沒有cte只使用連接..可能.. – Meline

2

不使用UNION ALL和多個SELECT語句

SELECT COALESCE(parent.ParentID, Child1.child1id, Child2.child2id), 
     COALESCE(Child2.child2, Child1.child1, parent.Parent), 
     COALESCE(Child1.ParentIdId, Child2.child1id) FROM parent 
FULL JOIN Child1 on 1 = 2 
FULL JOIN Child2 on 1 = 2 
+0

@Meline是你的意思嗎? – SAJ

+0

謝謝QSAJ。但那是什麼1 = 2和1 = 2。我可以使用IDS – Meline

相關問題