我需要用这些表创建一个简单的数据库:
表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
我的问题是如何从人名中打印上一代的所有孩子?
答案 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 |
+-----------+-------------+------------+------------------+