2015-05-29 63 views
1

我有以下两列的表。SQL父级子递归查询 - 包括亲属亲属

Parent Child 
A  C 
A  D 
B  A 
B  E 
C  H 
J  C 
F  G 
G  I 

所以我需要在A的父通过,我应该得到以下背全一的家长和孩子也是所有家长和孩子关联到(父亲或母亲的那些或孩子)我需要他们所有的父母和孩子,等等。

所以在一个被传递给PROC我会得到的例子如下

A C 
A D 
B A 
B E 
C H 
J C 

若F获得通过,我只想得到

F G 
G I 
+2

[SQL递归函数,得到一个项目的所有祖先(可能重复http://stackoverflow.com/questions/16749095/sql-recursive-function-that-gets-all-ancestors-of-一个项目) – rutter

回答

1
select * from test 
where parent in (
    select parent from test 
    where parent = 'F' or child = 'F' 

    union 
    select child from test 
    where child = 'F' or parent = 'F') 

or child in (
    select parent from test 
    where parent = 'F' or child = 'F' 

    union 
    select child from test 
    where child = 'F' or parent = 'F'); 
+1

我不认为这将处理深递归。 – johnjps111

+0

谢谢约翰尼,你为什么这么想? – MicroMan

1

试试这个,这是类似于评论中给出的链接,但是同时考虑了父母和孩子的递归。希望它能为你工作。

WITH relationships AS (
    SELECT * 
    FROM Table 
    WHERE Child = 'A' 
    UNION ALL 
    SELECT p.* 
    FROM Table p 
    JOIN relationships pa on pa.Child = p.Parent 
    UNION ALL 
    SELECT c.* 
    FROM Table c 
    JOIN relationships ch on ch.Parent = c.Child 
) 
select * 
from name_tree; 
+0

此解决方案不起作用。感谢评论。 – MicroMan

+0

以F和G为例,它只将F作为G而不是G&I – MicroMan

+0

如何在Where Child ='A'添加行添加OR父='A'这似乎工作 – MicroMan