2015-06-15 30 views
5

我需要一些关于SQL代码的帮助。我有2个表,第一个是表名找到所有基于特定记录的父母

NameID Name  
1   John   
2   Paul   
3   Jessica   
4   Nancy   
5   Sam   
6   Jane 
7   Jimmy 

第二个是表家庭

FamilyID NameID ChildID 
    1   1   2 
    2   1   3 
    3   2   4 
    4   3   5 
    5   3   6 
    6   5   7 

在表家庭域“填充NameID”和“childID的”被连接到字段“填充NameID”在表名称。所以,如果我把它放在一棵树它会是这样

  John 
     /\ 
     Paul Jessica 
    / /\ 
    Nancy Sam Jane 
      /
      Jimmy 

我需要的是SQL代码,可以找到某条记录“全部”的父母。例如:

  1. 我想知道从简所有的父母,结果将是:杰西卡, 约翰
  2. 我想知道从吉米所有的父母,结果将是:萨姆, 杰西卡,约翰

  3. 我想知道从南希所有的父母,结果将是:保罗,约翰

+0

能否请您包括您试一下查询? – zedfoxus

+0

其实我仍在使用cte递归,但尚未完成 –

+0

你的意思是所有的祖先?这就是#2提供的例子。 CTE就是我所要做的。 –

回答

4

在这里你去,如下使用递归CTE:

DECLARE @pName VARCHAR(20) 
    SET @pName = 'Jane' 

    ;WITH RecursiveFamilyCTE 
      AS (
       SELECT 
       ParentName.NAME, 
       ParentName.NameID, 
       f.ChildID 
       FROM 
       dbo.Family AS f 
       JOIN NAME AS ChildName 
        ON f.ChildID = ChildName.NameID 
       JOIN Name AS ParentName 
        ON f.NameID = ParentName.NameID 
       WHERE 
       ChildName.NAME = @pName 

       UNION ALL 

       SELECT 
       ParentName.NAME, 
       ParentName.NameID, 
       f.ChildID 
       FROM 
       dbo.Family AS f 
       JOIN NAME AS ChildName 
        ON f.ChildID = ChildName.NameID 
       JOIN Name AS ParentName 
        ON f.NameID = ParentName.NameID 
       JOIN RecursiveFamilyCTE 
        ON f.ChildID = RecursiveFamilyCTE.NameID 
      ) 
    SELECT 
     NAME 
    FROM 
     RecursiveFamilyCTE 
+0

完美的作品,谢谢很多先生:) –

+0

我改变了它现在只使用@pName参数在我的第一篇文章中被忽略。 – JohnS

+0

编辑 - upvoted :) –

0

递归查询是继续这个问题的方法。这在下面是一个灵活的查询,您可以在没有参数的情况下运行。

with familytree as (
    select childid, nameid 
    from family 
    where nameid is not null 

    union all 

    select f.childid, t.nameid 
    from familytree t 
    inner join family f on t.childid = f.nameid 
), 
treedetails as (
    select 
    p.nameid as parentid, p.name as parent, 
    c.nameid as childid, c.name as child 
    from familytree a 
    left join name p on a.nameid = p.nameid 
    left join name c on a.childid = c.nameid 
) 
-- uncomment the query of your choice 
-- select * from treedetails where child = 'Jimmy' 
-- select * from treedetails where child = 'Jane' 
-- select * from treedetails where child = 'Nancy' 
-- 
-- show me children and grandchildren of Jessica 
-- select * from treedetails where parent = 'Jessica' 

样品:http://www.sqlfiddle.com/#!3/f7030/4

相关问题