根据特定记录查找所有父母

ant*_*ron 5 sql sql-server sql-server-2008

我需要一些关于SQL代码的帮助.我有2个表,第一个是表名

NameID   Name      
1          John          
2          Paul          
3          Jessica          
4          Nancy          
5          Sam          
6          Jane
7          Jimmy
Run Code Online (Sandbox Code Playgroud)

第二个是表Family

 FamilyID   NameID    ChildID
    1          1           2
    2          1           3
    3          2           4
    4          3           5
    5          3           6
    6          5           7
Run Code Online (Sandbox Code Playgroud)

表Family中的字段"NameID"和"ChildID"连接到表Name中的字段"NameID".所以,如果我把它放在一棵树上就会是这样的

         John
         /  \
      Paul  Jessica
      /       /  \
   Nancy    Sam  Jane
            /
          Jimmy
Run Code Online (Sandbox Code Playgroud)

我需要的是SQL代码,可以找到"所有"父母的特定记录.例如 :

  1. 我想知道Jane的所有父母,结果将是:Jessica,John
  2. 我想知道Jimmy的所有父母,结果将是:Sam,Jessica,John

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

Joh*_*hnS 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
Run Code Online (Sandbox Code Playgroud)