2015-06-15 29 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

相關問題