简单家庭数据库

时间:2017-02-16 21:56:42

标签: sql sql-server

我需要用这些表创建一个简单的数据库:

表1(人员表)

Person_ID INT,
Person_name TEXT,
Person_age INT,
Person_birthdate DATE

表2(父母与子女表)

Parent_ID INT,
Child_ID INT

在第一张表中,我家的所有人都输入了基本信息,在第二张表中,每个父母都与他们的孩子一起输入。

例如:我的妈妈的身份证号码为#77,而我父亲的身份证号码为#42,我的身份证号码为#53。第二个表中的行将是:

Parent ID | Child ID
77        | 53
42        | 53

我的问题是如何从人名中打印上一代的所有孩子?

1 个答案:

答案 0 :(得分:0)

这使用递归公用表表达式(cte)获取所有后代,连接到Person表以获取详细信息,并使用not exists()过滤自己孩子的人。

测试设置: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
  );

结果:

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