2013-07-01 70 views
2

我有一个表名factors。它包含的数据是这样的:如何从孩子ID选择父母ID

id  Name   paretnID 
1  abc   0 
2  xyz   0 
3  abc1   1 
4  abc2   1 
5  abc3   1 
6  qwe   0 
7  xyz1   2 
8  xyz2   2 

我有这样一个集ID:(1,4,7,8)

我想告诉所有的父母和孩子的ID。 像这样

id  name  parentID 
1  abc   0 
2  xyz   0 
4  abc2  1 
7  xyz1  2 
8  xyz2  2 

在我的ID列表2不在场,但ID 278所以它在结果集显示父。

如何编写查询以显示以上结果?

+0

为什么'3','5'和'6'不在结果? –

+0

@ypercube为我的理解,他希望所有节点(1,4,7,8)和所需的父母 – bummi

+0

正确的@bummi,你是对的 – user1926138

回答

2
Declare @a table (id int , Name Varchar(100) ,  parentID int) 
Insert into @a 
Select 1,'abc',0 
UNION Select 2,'xyz',0 
UNION Select 3,'abc1',1 
UNION Select 4,'abc2',1 
UNION Select 5,'abc3',1 
UNION Select 6,'qwe',0 
UNION Select 7,'xyz1',2 
UNION Select 8,'xyz2',2 


;WITH Rollups AS (
    SELECT Id, ParentId,Name 
    FROM @a Child WHERE ID in (1,4,7,8) 
    UNION ALL 
    SELECT cl.Id, cl.ParentId, cl.Name 
    FROM @a cl 
    INNER JOIN Rollups Children ON Children.ParentID = cl.Id 
) 
SELECT DISTINCT * 
FROM Rollups 
Order by ID 
+0

我们可以使用一个查询来解决上述问题吗? – user1926138

+0

它是一个查询盯着'; WITH'并以'Order by ID'结尾@a将是你的表。如果你的树超过两层,不使用CTE,你不会得到期望的结果。 – bummi

+0

你能解释一下什么汇总工作? – user1926138

1

SELECT 
    id.name,parentid 
FROM 
    factors 
WHERE 
    id IN (1,4,7,8) 

UNION 

SELECT 
    p.id.p.name,p.parentid 
FROM factors c 
JOIN factors p 
ON c.parentid = p.id 
WHERE 
    c.id IN (1,4,7,8)