【问题标题】:Find All Parents based on certain record根据特定记录查找所有父母
【发布时间】:2015-06-15 03:08:25
【问题描述】:

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

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

第二个是table Family

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

表 Family 中的字段“NameID”和“ChildID”连接到表 Name 中的字段“NameID”。所以如果我把它放在树上它会是这样的

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

我需要的是 SQL 代码,它可以为某些记录找到“所有”父母。例如:

  1. 我想了解 Jane 的所有父母,结果将是:Jessica, 约翰
  2. 我想了解 Jimmy 的所有父母,结果将是:Sam, 杰西卡,约翰

  3. 我想了解 Nancy 的所有父母,结果将是:Paul, John

【问题讨论】:

  • 能否请您包含您尝试过的查询?
  • 其实我还在用 cte recursive 处理它,但还没有完成
  • 你的意思是所有的祖先?这就是示例 #2 所建议的。我会做 CTE。
  • @PeterWone 是的,如果您对我的话感到困惑,您可以说“所有祖先”对不起。我是使用 CTE 的新手,所以我需要一些帮助 :)。
  • 您使用的是哪个数据库服务器?甲骨文?

标签: sql sql-server sql-server-2008


【解决方案1】:

在这里,使用递归 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

【讨论】:

  • 我刚刚将其更改为使用在我的第一篇文章中被忽略的@pName 参数。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多