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

Здесь вы идете, используйте рекурсивный КТР следующим образом:

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

работает отлично, спасибо большое sir :) –

+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

Смежные вопросы