首页 > 解决方案 > 在一个 SQL 语句中检索列表列表

问题描述

我有两张表(比如说)Person 和 Parent,Parent-Person 是多对一的关系,所以一个人可以有很多父母,直接的和间接的(祖父母等)。Parent有外键personId,Person的主键当然是personId。

Person table
Id <PK>

Parent table
Id<PK>
ParentPersonId <FK into Person >

Person has rows with values PK 
1
2
3

Parent has rows with values
1, 2
1, 3
2, 3

so person 1 has parents 2, 3

I eapect to get List<Person>

[ {1, {2,3}}, {2, {3}}, {3} ]

我正在使用 Spring Boot JDBC 来查询 MS SQL 服务器数据库,我可以获得 personId 的所有父母,当然,我可以获得 Person 表中所有人的列表。但是是否有可能在一个 SQL 语句中检索所有人员的列表,并在人员类中检索作为与父表连接的结果的人员 ID 列表?

还是我必须分两步完成。获取人员列表,然后在数据库中查询每个人的父母列表?

我正在尝试做这样的事情,但它说“语法错误”。

 select ID as personId (select * from Parent where personId = parentPersonId) from Person

标签: sqlsql-serverspring-bootspring-jdbc

解决方案


假设您在 Parent 表中的数据不是递归的(该表包含每个祖先的一行,直接或间接),您可以使用一个简单的查询:

select per.id, par.parentPersonId 
from Person per left join Parent par 
on per.id = par.id

如果您的数据是递归的(显然不是,因为 3 既是 1 的父母又是祖父母),您需要使用递归 CTE 查询。请参阅我的后续问题中的代码Is branch pruning possible for recursive cte query


推荐阅读