Получить список списков одним оператором SQL - PullRequest
0 голосов
/ 28 января 2020

У меня есть две таблицы (скажем, «Персона» и «Родитель», где «Родитель-личность»): отношения между многими и одним человеком, поэтому у человека может быть много родителей, прямых и косвенных (grandparents et c). Родитель имеет внешний ключ 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 JDB C для запроса базы данных сервера MS SQL, и я могу получить всех родителей для personId и, конечно, я могу получить список всех людей в таблице Person. Но возможно ли в одном операторе SQL получить список всех лиц и внутри класса, идентификатор списка людей, который является результатом объединения с родительской таблицей?

Или я должен сделать это в 2 шага. Получить список людей, а затем запросить в базе данных список родителей каждого человека?

Я пытаюсь сделать что-то вроде этого, но он говорит «синтаксическая ошибка».

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

1 Ответ

1 голос
/ 28 января 2020

Предполагая, что ваши данные в родительской таблице не являются рекурсивными (эта таблица содержит строку для каждого предка, прямого или косвенного), вы можете использовать простой запрос:

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

Если ваши данные являются рекурсивными (по-видимому, нет, так как 3 является родительским и прародительским для 1), вам нужно использовать запрос рекурсивного CTE. См. Код в моем следующем вопросе Возможно ли сокращение ветви для рекурсивного запроса cte

...