2017-02-16 2 views
1

Ich brauche eine einfache Datenbank mit diesen Tabellen zu machen:Einfache Familie Database

Tabelle 1 (People Tabelle)

Person_ID INT, 
Person_name TEXT, 
Person_age INT, 
Person_birthdate DATE 

Tabelle 2 (Parent & Child Table)

Parent_ID INT, 
Child_ID INT 

In der ersten Tabelle sind alle Personen meiner Familie mit grundlegenden Informationen eingegeben In der zweiten Tabelle ist jeder Elternteil mit seinem Kind eingetragen.

Zum Beispiel: meine Mutter hat ID # 77 und mein Vater hatte ID # 42 und ich habe ID # 53. Die Zeilen in der zweiten Tabelle wären:

Parent ID | Child ID 
77  | 53 
42  | 53 

Meine Frage ist, wie kann ich alle Kinder in der letzten Generation von einer Person id drucken?

+0

'MySQL' oder' SQL Server'? Sie sind nicht dasselbe. – Siyual

+0

@ Siyual SQL Server –

+0

Es scheint einen Fehler in Ihrem Design zu geben. In diesem Entwurf kann ein Preson mehr als 2 Eltern haben ... –

Antwort

0

Dieses verwendet einen rekursiven allgemeinen Tabellenausdruck (CTE) alle Nachkommen zu erhalten, schließt sich an die Person Tabelle für Details und filtert Menschen, die mit not exists() ihre eigenen Kinder aus haben.

Testaufbau: http://rextester.com/QTTIS9257

create table Person (
    Person_Id int 
    , Person_Name varchar(32) 
    , Person_Age int 
    , Person_BirthDate date 
); 
insert into Person (Person_Id, Person_Name) values 
(53,'Bader'); 

create table ParentChild (
    Child_Id int not null 
    , Parent_Id int null 
); 
insert into ParentChild values 
(53,42),(53,77),(42,21),(77,9),(9,null),(21,null); 

declare @PersonId int; 
set @PersonId = 9; -- Parent to 77 

/* recursive cte to get all descendantsof @PersonId*/ 
with cte as (
select Parent_Id, Child_Id 
    from ParentChild 
    where Parent_Id = @PersonId 
union all 
select c.Parent_Id, c.Child_Id 
from ParentChild c 
    inner join cte p 
    on c.Parent_Id = p.Child_Id 
) 

/* join Person to cte to get Person's details */ 
select p.* 
    from Person as p 
     inner join cte 
     on p.Person_Id = cte.Child_Id 
/* don't return children who are parents */ 
where not exists (
    select 1 
    from cte i 
    where i.Parent_Id = p.Person_Id 
); 

Ergebnisse:

+-----------+-------------+------------+------------------+ 
| Person_Id | Person_Name | Person_Age | Person_BirthDate | 
+-----------+-------------+------------+------------------+ 
|  53 | Bader  | NULL  | NULL    | 
+-----------+-------------+------------+------------------+ 
+0

Danke, Sie haben mich gerettet <3 –

+0

@BaderAli Glücklich zu helfen! Wenn diese Antwort für Sie funktioniert, akzeptieren Sie sie bitte. – SqlZim